在消息重新传递期间保留 JMS 消息 Headers
Persisting JMS Message Headers during Message Redelivery
我们有一个骆驼路线,我们从输入 queue 读取消息,处理它,设置一些 JMS Header( 使用 Exchange.getIn().setHeader(...) ) 然后将消息路由到某个输出 queue。在 MQ 故障转移场景中,消息被重新传递。但是,在重新传递消息时,我之前放置的 JMS Headers 丢失了。
有什么方法可以在重新交付后保留 JMS Headers 吗?
JMS 重新传送
不,如果消息是从输入队列重新传送的,则不会。仅仅是因为它与您之前收到的相同的原始消息。 JMS 代理对您在 Camel 路由中所做的修改一无所知。
不过,这通常不是问题。因为在重新投递时,同一个消费者再次使用消息并再次对消息进行相同的修改。
一旦您到达路线中的 "transaction boundary"(这意味着,某些事情已经发生 无法重复 或会产生不同的结果),您应该将修改后的消息放在另一个队列中以 "save" 其当前状态。
从那里您可以继续与另一个消费者等。如果你像这样建立一个处理链,你的系统就是一个Pipes and Filter EIP.
骆驼补发
另一种可能性是使用Camel ErrorHandler。它在单个路由步骤级别处理错误。它也可以进行重试,但是如果所有 Camel 重试失败(例如将消息发送到错误队列),您必须确保正确处理消息。
只要代理重新投递是您消息的最后手段,您就应该在构建系统时考虑到潜在的重新投递。
我也有这个问题。我被迫将我的 object 转换为 json 并保存在 jms 的 headers 中。在我再次转换为 object 之后。它对我有用!
我们有一个骆驼路线,我们从输入 queue 读取消息,处理它,设置一些 JMS Header( 使用 Exchange.getIn().setHeader(...) ) 然后将消息路由到某个输出 queue。在 MQ 故障转移场景中,消息被重新传递。但是,在重新传递消息时,我之前放置的 JMS Headers 丢失了。 有什么方法可以在重新交付后保留 JMS Headers 吗?
JMS 重新传送
不,如果消息是从输入队列重新传送的,则不会。仅仅是因为它与您之前收到的相同的原始消息。 JMS 代理对您在 Camel 路由中所做的修改一无所知。
不过,这通常不是问题。因为在重新投递时,同一个消费者再次使用消息并再次对消息进行相同的修改。
一旦您到达路线中的 "transaction boundary"(这意味着,某些事情已经发生 无法重复 或会产生不同的结果),您应该将修改后的消息放在另一个队列中以 "save" 其当前状态。
从那里您可以继续与另一个消费者等。如果你像这样建立一个处理链,你的系统就是一个Pipes and Filter EIP.
骆驼补发
另一种可能性是使用Camel ErrorHandler。它在单个路由步骤级别处理错误。它也可以进行重试,但是如果所有 Camel 重试失败(例如将消息发送到错误队列),您必须确保正确处理消息。
只要代理重新投递是您消息的最后手段,您就应该在构建系统时考虑到潜在的重新投递。
我也有这个问题。我被迫将我的 object 转换为 json 并保存在 jms 的 headers 中。在我再次转换为 object 之后。它对我有用!