您好我是Camel的新手,并且有一个与JMS队列相关的设计问题。
我收到一组数据。这些数据有参考日期。这些数据每15分钟由批处理过程发送一次。
我必须处理收到的数据并将它们转发到另一条路线。
如果无法处理给定数据,我需要重新处理它。我必须确保在处理下一个数据集之前对其进行处理。
所以我想在创建JMS路由以在处理之前接收这些数据。然后处理它。然后将其发送到另一个队列。
FTP - >过程数据行(A) - > JMS队列 - >处理器(B) - >直接:呼叫
如果处理器B出现故障,我希望在FTP发送下一个数据集之前处理数据。 (因为第二个数据集可能包含第一个数据集的数据更新)
所以我在考虑使用队列,以确保它们始终按照接收顺序进行处理。
但是我在没有Camel的情况下使用JMS的经验是,一旦从队列中消耗了对象,它就不再在队列中了。 Camel也是如此吗? 在这种情况下,我必须重试处理数据,或将它们放回队列?
这"恢复"部分对我来说并不清楚,我想了解支持这一点的模式。
非常感谢你的帮助
吉勒
答案 0 :(得分:0)
这部分"一旦从队列中消耗了对象,它就不再在队列中了。"不完全正确。实际上,当您订阅队列并获取消息时,您需要处理它并将确认发送回JMS代理。如果确认成功,则消息将从队列中删除。但是,如果确认不成功或者您的流程将会死亡并且与代理的连接中断,那么该消息将不会从队列中删除并将传递给另一个消费者。
当消费者收到消息时,大多数JMS库通常都会使用模式,但是当您的处理部件成功完成时,您总是可以更改此模式并手动发送确认。
如果是camel jms(http://camel.apache.org/jms.html)你可以使用端点选项" acknowledgementModeName"它有一些不同的可能值,如: