在Hawtio ActiveMQ插件中,有将消息从一个队列移动到另一个队列的功能。这个过程保持消息体和所有的消息头与原始消息相同。
有没有办法在Camel中做到这一点?一个简单的from(queue1).to(queue2)
似乎总是改变头。
编辑:已尝试
from(
"cMQConnectionFactory1:queue:queue1"
+ "?forceSendOriginalMessage=" + true
+ "&mapJmsMessage=" + false)
.routeId("testMove_cJMS_1")
.to("cMQConnectionFactory1:queue:queue2"
+ "?forceSendOriginalMessage=" + true
+ "&mapJmsMessage=" + false).id("testMove_cJMS_2");
}`
1条答案
按热度按时间gblwokeq1#
JMS组件的Camel documentation描述了
forceSendOriginalMessage
选项:当使用mapJmsMessage=false时,如果您在路由过程中触摸头(get或set),Camel将创建一个新的JMS消息发送到新的JMS目的地。将此选项设置为true以强制Camel发送收到的原始JMS消息。
forceSendOriginalMessage
默认为false
。关于
mapJmsMessage
的文档是这样说的:指定Camel是否应该将接收到的JMS消息自动Map到合适的负载类型,比如javax.jms.TextMessage到String等。
mapJmsMessage
默认为true
。因此,似乎需要设置
mapJmsMessage=false
和forceSendOriginalMessage=true
。请记住,Camel将使用JMS API来使用消息,然后重新发送它。尽管新消息将具有与旧消息相同的消息体和消息头,但它将有 * 轻微 * 不同,因为JMS规范规定,当发送消息时,代理必须为其分配消息ID和时间戳。因此,新消息上的JMSMessageID和JMSTimestamp将与旧消息不同,这是没有办法的。如果需要唯一地标识消息,则应该在原始消息上设置相关ID,并使用它来标识消息,而不是JMSMessageID。此外,如果您需要保留消息发送的原始时间,请在自定义属性中设置该时间。
在通过管理控制台移动消息时,JMSMessageID和JMSTimestamp没有更改的原因是,代理在内部移动消息的机制与JMS完全不同。