Apache camel 在Camel中复制AMQ管理UI移动功能

Apache camel 在Camel中复制AMQ管理UI移动功能,apache-camel,jms,activemq,Apache Camel,Jms,Activemq,在ActiveMQ(和Hawtio)中,有管理UI功能可以将消息从一个队列移动到另一个队列。此过程使正文和所有标题与原始消息保持一致 有没有一种方法可以在Camel中实现这一点?从(queue1).到(queue2)的简单似乎总是会更改头 谢谢 编辑:已尝试 from( "cMQConnectionFactory1:queue:queue1" + "?forceSendOriginalMessage=" + true

在ActiveMQ(和Hawtio)中,有管理UI功能可以将消息从一个队列移动到另一个队列。此过程使正文和所有标题与原始消息保持一致

有没有一种方法可以在Camel中实现这一点?从(queue1).到(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");
}` 
JMS组件的示例描述了
forceSendOriginalMessage
选项,说明:

当使用mapJmsMessage=false时,如果您在路由过程中触摸头(get或set),Camel将创建一条新的JMS消息以发送到新的JMS目标。将此选项设置为true以强制Camel发送接收到的原始JMS消息

forceSendOriginalMessage
默认为
false

文档中这样说是关于
mapJmsMessage

指定Camel是否应将收到的JMS消息自动映射到合适的负载类型,例如javax.JMS.TextMessage到字符串等

mapJmsMessage
默认为
true

因此,似乎需要设置
mapJmsMessage=false
&
forceSendOriginalMessage=true

请记住,Camel将使用jmsapi来使用消息,然后重新发送消息。尽管新消息与旧消息具有相同的正文和标题,但会略有不同,因为JMS规范规定,在发送消息时,代理必须为其分配消息ID和时间戳。因此,新消息上的JMSMessageID和JMSTimestamp将与旧消息不同,这是无法避免的。如果您需要唯一地标识消息,那么应该在原始消息上设置,并使用它来标识消息,而不是JMSMessageID。此外,如果需要保留消息发送的原始时间,请在自定义属性中设置该时间

在通过管理控制台移动消息时,JMSMessageID和JMSTimestamp没有更改的原因是代理使用与JMS完全不同的机制在内部移动消息。

JMS组件的
forceSendOriginalMessage
选项说明:

当使用mapJmsMessage=false时,如果您在路由过程中触摸头(get或set),Camel将创建一条新的JMS消息以发送到新的JMS目标。将此选项设置为true以强制Camel发送接收到的原始JMS消息

forceSendOriginalMessage
默认为
false

文档中这样说是关于
mapJmsMessage

指定Camel是否应将收到的JMS消息自动映射到合适的负载类型,例如javax.JMS.TextMessage到字符串等

mapJmsMessage
默认为
true

因此,似乎需要设置
mapJmsMessage=false
&
forceSendOriginalMessage=true

请记住,Camel将使用jmsapi来使用消息,然后重新发送消息。尽管新消息与旧消息具有相同的正文和标题,但会略有不同,因为JMS规范规定,在发送消息时,代理必须为其分配消息ID和时间戳。因此,新消息上的JMSMessageID和JMSTimestamp将与旧消息不同,这是无法避免的。如果您需要唯一地标识消息,那么应该在原始消息上设置,并使用它来标识消息,而不是JMSMessageID。此外,如果需要保留消息发送的原始时间,请在自定义属性中设置该时间


在通过管理控制台移动消息时,JMSMessageID和JMSTimestamp没有更改的原因是代理使用与JMS完全不同的机制在内部移动消息。

在消费者和生产者(我使用talend)上尝试了这一点,并在现在编辑的原始问题中生成了代码(见上文)仍然会为登录到queue2上的消息生成新的JMS消息ID和时间戳……如果您使用JMS API(例如,与Camel一起使用),则实际上无法绕过这一点,因为每当发送消息时,它都会获得新的ID和时间戳。通过管理控制台工作的原因是代理在内部移动消息,而不是使用JMS API。我根据您的评论更新了我的答案,并提供了一个潜在的解决方案。如果我的回答回答了您的问题,请将其标记为正确,以帮助将来可能有相同问题的其他用户。否则,请澄清仍然缺少什么。谢谢在消费者和生产者(我使用talend)上都尝试过这一点,并且在现在编辑的原始问题(见上文)中生成的代码仍然会导致新的JMS消息ID和消息登录到queue2上的时间戳……如果您使用JMS API(例如,与Camel一起),则确实无法避免这一问题因为无论何时发送消息,它都会得到一个新的ID和时间戳。通过管理控制台工作的原因是代理在内部移动消息,而不是使用JMS API。我根据您的评论更新了我的答案,并提供了一个潜在的解决方案。如果我的回答回答了您的问题,请将其标记为正确,以帮助将来可能有相同问题的其他用户。否则,请澄清仍然缺少什么。谢谢