2013-02-08 34 views
3

我正在使用ActiveMQ故障转移ActiveMQ故障转移:如何检测应用程序何时启动并找不到代理

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

我想在host1和host2都不可用时提醒。

如果应用程序已连接到代理程序,则可以通过TransportListener检测它何时进行故障切换。在初始连接期间,这是不可能的。它会挂起,反复重试每个经纪人。这是我希望的行为,因为我希望它继续尝试连接,但是我也想通知它有问题,以便我可以提醒,并且有人可以查看它。

一种解决方案是使用

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

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

有没有更好的方式检测初始连接上的代理问题?

+0

不知道你在问什么... startupMaxReconnectAttempts听起来像它给你你想要的错误反馈。如果不会尝试重新连接,因为您将它设置为1 ... – 2013-02-14 16:31:21

+0

正如我所说的,startupMaxReconnectAttempts = 1是一个解决方案。我的问题是,在应用程序启动时是否有更好的方法来检测不可用的代理?即一个不需要我的应用程序代码来处理在代理不可用时发出警报后重新连接。就像使用TransportListener获取故障切换一样。另外,检测单个经纪人不可用的方式将是有用的。 – Spycho 2013-02-15 09:51:47

回答

3

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

长答案:作为一个应用程序,您只有在以下情况时才会知道:您根本没有代理(通过startupMaxReconnectAttempts),或者当您从一个代理切换到另一个代理时。这是预期的和期望的行为,因为故障转移机制的全部要点是将所有这些从消费者中隐藏起来。

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

我认为你正试图解决一个错误的工具问题:使用故障切换机制(最大重新连接和适当的超时)只会确保你得到通知时,事情变得非常错误(根本没有经纪人可用)。 其他经纪人的“健康”或“连接性”需要一个单独的机制(在系统级别 - 使用监控工具 - 或在应用程序级别 - 开发一个小机制,以保持uri列表中的所有经纪人活着)

相关问题