使用apache camel xml路由,如何从JMS消息设置自定义文件名?
使用JavaJMSAPI,我从数据库中获取了一个字节数组,然后将其作为javax.JMS.BytesMessage发送到ActiveMQ。之后,我想用camel将文件放到一个位置 我有一条骆驼路线:使用apache camel xml路由,如何从JMS消息设置自定义文件名?,jms,activemq,apache-camel,Jms,Activemq,Apache Camel,使用JavaJMSAPI,我从数据库中获取了一个字节数组,然后将其作为javax.JMS.BytesMessage发送到ActiveMQ。之后,我想用camel将文件放到一个位置 我有一条骆驼路线: <route> <from uri="activemq:queue.fileOuput"/> <convertBodyTo type="java.nio.ByteBuffer"/> <to uri="f
<route>
<from uri="activemq:queue.fileOuput"/>
<convertBodyTo type="java.nio.ByteBuffer"/>
<to uri="file://C:/output/"/>
</route>
但是我的问题是,我的文件在c:\output\
目录中,我得到了以消息id作为文件名的文件,如
queue-preverificion-fileoutput-ID-jmachine-57401-1347652410053-0-1-1-1
但是我想把我的名字放到数据库中,比如MyFile.xml
我试着设置一个消息属性,比如fileName和file:name,我在apache文档中看到,我需要放一个标题“org.apache.camel.file.name”,但对于jms,我不知道如何做
所以我的问题是如何在骆驼路线中输入自定义名称
感谢大家。只需将文件名作为字符串属性放在jms消息中即可 然后你可以用骆驼做类似的事情
<to uri="file://C:/output/?fileName=${header.filename}"/>
您只需设置“CamelFileName”标题值(基于消息标题等)
${header.fileName}
我认为“org.apache.camel.file.name”是指camel 1.x,在2.x版本中,CamelFileName运行良好。但是我想要一个更动态的文件名,基于内容的文件名。这个使用处理器的示例运行良好(camel 2.18)
在处理器内部:
exchange.getIn().setHeader(exchange.FILE_NAME,myFileName);
这将不起作用,因为to uri是在路由的构建时计算的。上面带有CamelFileName头的解决方案应该可以使用。@ChristianSchneider:它就像一个符咒。文件名支持“文件表达式语言”=在运行时执行解释的简单语言,而不是路由生成时。刚刚测试了这个路由:
使用两个不同的消息(其中字符串属性filename=MyFile.txt和filename=YourFile.txt),它们是在c:\output\MyFile.txt和c:\output\YourFile.txt中按预期创建的
<to uri="file://C:/output/?fileName=${header.filename}"/>
<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>
<route>
<from uri="MQ:MY_Q_NAME" />
<process ref="MyMessageProcessor"/>
<to uri="file://E:\OUTPUT" />
</route>
Inside the Processor :
exchange.getIn().setHeader(Exchange.FILE_NAME, myFileName);