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