【问题标题】:ActiveMQ Fail-over: How to detect when an application starts and cannot find a brokerActiveMQ 故障转移:如何检测应用程序何时启动但找不到代理
【发布时间】:2013-03-19 11:45:43
【问题描述】:

我正在使用 ActiveMQ 故障转移,例如

failover:(tcp://host1:61616,tcp://host2:61616)

我想在 host1 和 host2 都不可用时发出警报。

如果应用程序已经连接到代理,您可以通过 TransportListener 检测它何时进行故障转移。在初始连接期间也是不可能的。它只会挂起,反复重试每个代理。这是期望的行为,因为我希望它继续尝试连接,但我也希望收到它有问题的通知,以便我可以发出警报,并且有人可以调查它。

一种解决方案是使用

failover:(tcp://host1:61616,tcp://host2:61616)?startupMaxReconnectAttempts=1

这意味着它将尝试每个主机,然后抛出一个异常,我的应用程序可以通过警告然后再次尝试连接来处理该异常。这并不理想,因为我的应用程序必须有效地复制 ActiveMQ 重新连接逻辑。

有没有更好的方法来检测初始连接时出现的代理问题?

【问题讨论】:

  • 不确定您在问什么...startupMaxReconnectAttempts 听起来像是为您提供了所需的错误反馈。 if 不会尝试重新连接,因为您将其设置为 1...
  • 正如我所说,startupMaxReconnectAttempts=1 是一种解决方案。我的问题是,有没有更好的方法来检测应用程序启动时不可用的代理? IE。一种不需要我的应用程序代码在收到代理不可用警报后处理重新连接的问题。类似于您使用 TransportListener 检测故障转移所获得的东西。此外,检测单个代理不可用的方法也会很有用。

标签: java jms activemq


【解决方案1】:

简短回答:不,没有办法从客户端(应用程序)启动的角度知道。

长答案:作为一个应用程序,您只会知道什么时候:您根本没有可用的代理(通过 startupMaxReconnectAttempts),或者您何时从一个代理切换到另一个代理。这是预期和期望的行为,因为故障转移机制的全部意义在于向消费者隐藏所有这些。

可能有一些解决方法(例如使用dynamic network of brokers),但这需要比您提出的解决方案更多的逻辑。

我认为您正在尝试使用错误的工具来解决问题:使用故障转移机制(具有最大重新连接和适当的超时)只会确保您在真正出现问题时得到通知(根本没有可用的代理)。 其他代理的“健康”或“连接”需要一个单独的机制(在系统级别 - 使用监控工具 - 或在应用程序级别 - 开发一个小机制来对 uri 列表中的所有代理保持活动状态)

【讨论】:

    猜你喜欢
    • 2019-01-13
    • 1970-01-01
    • 2015-10-29
    • 2011-09-19
    • 1970-01-01
    • 2019-05-01
    • 2022-01-04
    • 2017-02-04
    • 2013-08-26
    相关资源
    最近更新 更多