Camel JMS队列轮询和数据恢复

时间:2017-04-18 15:55:47

标签: ftp apache-camel jms recovery

您好我是Camel的新手,并且有一个与JMS队列相关的设计问题。

我收到一组数据。这些数据有参考日期。这些数据每15分钟由批处理过程发送一次。

我必须处理收到的数据并将它们转发到另一条路线。

如果无法处理给定数据,我需要重新处理它。我必须确保在处理下一个数据集之前对其进行处理。

所以我想在创建JMS路由以在处理之前接收这些数据。然后处理它。然后将其发送到另一个队列。

FTP - >过程数据行(A) - > JMS队列 - >处理器(B) - >直接:呼叫

如果处理器B出现故障,我希望在FTP发送下一个数据集之前处理数据。 (因为第二个数据集可能包含第一个数据集的数据更新)

所以我在考虑使用队列,以确保它们始终按照接收顺序进行处理。

但是我在没有Camel的情况下使用JMS的经验是,一旦从队列中消耗了对象,它就不再在队列中了。 Camel也是如此吗? 在这种情况下,我必须重试处理数据,或将它们放回队列?

这"恢复"部分对我来说并不清楚,我想了解支持这一点的模式。

非常感谢你的帮助

吉勒

1 个答案:

答案 0 :(得分:0)

这部分"一旦从队列中消耗了对象,它就不再在队列中了。"不完全正确。实际上,当您订阅队列并获取消息时,您需要处理它并将确认发送回JMS代理。如果确认成功,则消息将从队列中删除。但是,如果确认不成功或者您的流程将会死亡并且与代理的连接中断,那么该消息将不会从队列中删除并将传递给另一个消费者。

当消费者收到消息时,大多数JMS库通常都会使用模式,但是当您的处理部件成功完成时,您总是可以更改此模式并手动发送确认。

如果是camel jms(http://camel.apache.org/jms.html)你可以使用端点选项" acknowledgementModeName"它有一些不同的可能值,如:

  • AUTO_ACKNOWLEDGE(默认值) - 确认将在#34;来自"之后立即发送。在你的路线
  • CLIENT_ACKNOWLEDGE - 允许应用程序控制何时发送确认,如果在交换处理期间没有异常将被抛出,则消息将被确认并从队列中删除。