java - ActiveMQ 故障转移 : How to detect when an application starts and cannot find a broker

标签 java jms activemq

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

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

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

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

一种解决方案是使用

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

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

是否有更好的方法来检测初始连接时的代理问题?

最佳答案

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

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

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

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

关于java - ActiveMQ 故障转移 : How to detect when an application starts and cannot find a broker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14773006/

相关文章:

java - JMS QueueSender 线程安全吗?

java - 尝试使用 Spring Boot 使用 JMS 主题消息时出现异常

java - 如何以编程方式在 Android 中反编译 dex 文件?

java - 使用 RabbitMQ 和 JMS API 进行事务管理

java - 如何在函数体中使用 if 和 switch 语句返回

java - 为 JMS 监听器处理 Spring Security 的首选方法是什么?

apache - Activemq、Redis 和 Apache camel 是正确的组合吗?

java - 如何解决 jms 中无效的连接参数?

java - 多线程 JApplet

java - Java 中的函数链