2012-09-14 44 views
0

使用java JMS API,我从一个DB获得一个字节数组,然后将它作为一个javax.jms.BytesMessage发送给一个ActiveMQ。之后,随着骆驼我希望把一个位置的文件,使用apache camel xml路由,如何从JMS消息设置自定义的fileName?

我在骆驼这条路线:

<route> 
     <from uri="activemq:queue.fileOuput"/> 
     <convertBodyTo type="java.nio.ByteBuffer"/> 
     <to uri="file://C:/output/"/> 
    </route> 

但我的问题是,我在c:\output\目录中的文件,我得到的文件与消息ID作为文件名,如 queue-preVerificacion-fileoutput-ID-jmachine-57401-1347652410053-0-1-1-1-1 但我想把我在数据库中的名称,如MyFile.xml

我试图设置一个消息属性像fileName和file:name,并且我在apache文档中看到需要放置一个头文件“org.apache.camel.file.name”,但是使用jms我不知道该怎么做。

所以我的问题是我怎么能把一个自定义名称在骆驼路线?

感谢所有。

回答

4

只需将文件名放置在jms消息中(作为字符串属性)。

// Something like this if you send the message using plain java/jms: 
msg.setStringProperty("filename","MyFile.xml"); 
..//Send msg 

然后,你可以做这样的事情在骆驼

<to uri="file://C:/output/?fileName=${header.filename}"/> 
+0

这将不会正常工作,因为uri会在构建路线时进行评估。上面的CamelFileName头解决方案应该可以工作。 –

+0

@ChristianSchneider:它像一个魅力。文件名支持“文件表达式语言”=在运行时进行解释的简单语言,而不是路径构建时间。刚刚测试此路线: ' \t \t \t <从URI = “ActiveMQ的:队列:foo.in”/> \t \t \t <到URI =“文件:// C:/输出/文件名= $ {header.filename}“/> \t \t' 随着两个不同的消息(其中字符串属性文件名= MyFile.txt的和文件名= YourFile.txt),他们只是创建为预期在C:\输出\ MyFile.txt和c:\ output \ YourFile.txt) –

+0

谢谢@Petter,就像你说的那样,它就像一个魅力一样。 – j2gl

3

你只需要设置“CamelFileName”头值(根据消息头,等等)

<route> 
    <from uri="activemq:queue.fileOuput"/> 
    <convertBodyTo type="java.nio.ByteBuffer"/> 
    <setHeader headerName="CamelFileName"> 
     <constant>${header.fileName}</constant> 
    </setHeader> 
    <to uri="file://C:/output/"/> 
</route> 
+0

谢谢@boday它也工作得很好。 – j2gl

相关问题