如何在Apache Camel中检测损坏/恢复的JMS连接?

时间:2013-09-05 10:30:35

标签: java jms apache-camel

我们正在使用Apache Camel(Camel 2.10.3,基于Java DSL)构建集成项目。

我们有一条路径从数据库中提取数据(让我们称之为IN_DB),做一些逻辑并每天一次插入另一个数据库(OUT_DB),另一条路由订阅XML数据的JMS主题,做一些逻辑并将其全天插入到同一个数据库(OUT_DB)中。

要求是当JMS主题连接因任何原因而关闭时,我们会不断尝试重新连接,一旦重新连接成功,我们需要返回数据库(IN_DB)并再次加载以填补空白主题失败的地方。

我的问题是我们怎样才能在Camel中执行这种逻辑('我已连接,然后我断开连接,现在又连接了')?当主题发生故障时,以主题消费者开头的路线会发生什么,路线会停止吗?或者它会向某个错误队列发出错误消息?我是否必须编写自己的处理程序来监视主题连接,或者当主题重新启动并设置一些消息头时Camel会自动重新连接,或者设置一些上下文变量以指示'我已连接然后我断开了连接现在我再次联系'情景已经发生了?我很高兴围绕调用数据库加载构建路由逻辑我无法找出在Camel中“检测”这种情况发生的最佳方法。

任何建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

就重新连接到队列而言,它取决于您使用的JMS代理。如果您正在使用ActiveMQ,那么您可以配置它如何通过URI重新连接,以便它可以尝试重新连接到另一个代理,在超时后重新连接到同一代理等。它的文档是here

要检测连接何时失败,从程序视图的角度来看,最简单的方法就是使用持久队列而不是主题。但是,假设这不可行,那么我认为你有两种选择。

  1. 定义JMS exception listener。这可以让您知道底层连接何时消失。
  2. 要检测再次备份的时间,我认为您已经停留在向特定主题发布消息并在另一条路线中查看来自此主题的消息。当您阅读有关此主题的消息时,您知道代理已重新启动,因此您可以从数据库重新加载数据。

    或2.您可以将常规的听力消息发布到您的JMS主题上。如果你停止接收他们,你知道经纪人已经失败了。一旦你再次开始获取它们,你知道它已经备份,你需要从数据库重新加载数据。