在Camel中复制AMQ Admin UI移动功能

j2cgzkjk  于 2023-10-18  发布在  Apache
关注(0)|答案(1)|浏览(101)

在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");
}`
gblwokeq

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=falseforceSendOriginalMessage=true
请记住,Camel将使用JMS API来使用消息,然后重新发送它。尽管新消息将具有与旧消息相同的消息体和消息头,但它将有 * 轻微 * 不同,因为JMS规范规定,当发送消息时,代理必须为其分配消息ID和时间戳。因此,新消息上的JMSMessageID和JMSTimestamp将与旧消息不同,这是没有办法的。如果需要唯一地标识消息,则应该在原始消息上设置相关ID,并使用它来标识消息,而不是JMSMessageID。此外,如果您需要保留消息发送的原始时间,请在自定义属性中设置该时间。
在通过管理控制台移动消息时,JMSMessageID和JMSTimestamp没有更改的原因是,代理在内部移动消息的机制与JMS完全不同。

相关问题