9

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

我们有一个从数据库中提取数据的路由(我们称之为 IN_DB),执行一些逻辑并每天插入另一个数据库(OUT_DB),另一个路由订阅 XML 数据的 JMS 主题,执行一些逻辑并插入它全天进入同一个数据库(OUT_DB)。

要求是当JMS主题连接由于某种原因断开时,我们会无限期地尝试重新连接,一旦重新连接成功,我们需要返回数据库(IN_DB)并再次加载以填补主题所在的空白下来了。

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

任何建议都非常感谢。

4

1 回答 1

4

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

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

  1. 定义一个JMS 异常侦听器。这应该让您知道底层连接何时消失。

为了检测它何时再次备份,我认为您坚持将消息发布到特定主题并在另一条路线中查看来自该主题的消息。当您阅读有关此主题的消息时,您知道代理已恢复,因此您可以从数据库重新加载数据。

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

于 2013-10-14T15:25:50.017 回答