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

Posted

技术标签:

【中文标题】如何在 Apache Camel 中检测损坏/恢复的 JMS 连接?【英文标题】:How to detect broken/recovered JMS connection in Apache Camel? 【发布时间】:2013-09-09 03:29:45 【问题描述】:

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

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

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

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

非常感谢任何建议。

【问题讨论】:

【参考方案1】:

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

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

    定义JMS exception listener。这应该让您知道底层连接何时消失。

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

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

【讨论】:

谢谢马特,这里有一些很好的建议。不幸的是,我们不拥有我们订阅的主题(Tibco EMS 代理),并且正在连接只读帐户,这使得心跳方法有点棘手。 JMS 异常会从哪里抛出? JMSComponent 本身,还是使用它的路由? 您似乎对选项有点卡住了!我手头没有示例,但是异常侦听器已在连接上注册,因此异常应该由连接引发,而不是从路由中的某个位置引发。您唯一的其他选择是定期查询 IN_DB 以查看它是否有任何您不知道的消息,但我怀疑这也不实用。

以上是关于如何在 Apache Camel 中检测损坏/恢复的 JMS 连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测pdf文档是不是有损坏

如何在apache camel中附加速度文件内容

如何在Apache Camel Aggregator关联中加入多个标头

如何在apache camel DSL或camel Processor内部设置其他身份验证属性?

如何在 Apache Camel 中定义要通过 ref 抛出的异常

Apache Camel:如何存储变量以供以后使用