使用apache camel xml路由,如何从JMS消息设置自定义文件名?

使用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

使用JavaJMSAPI,我从数据库中获取了一个字节数组,然后将其作为javax.JMS.BytesMessage发送到ActiveMQ。之后,我想用camel将文件放到一个位置

我有一条骆驼路线:

    <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);