【问题标题】:After broker restart, subscriber is not able to connect forever代理重新启动后,订阅者无法永远连接
【发布时间】:2014-12-22 11:08:06
【问题描述】:

使用 ActiveMQ-5.10。

重启broker后,客户端似乎无法恢复,永远吐了。客户抛出

[ 2014-12-18 18:17:58,852 [StatsCollector-3] jmx.TCAQueueSizeMonitor.getPendingQueueSize():68 错误]:获取 TCA 队列大小状态时出现异常!!! javax.jms.IllegalStateException:会话已关闭

    at org.apache.activemq.ActiveMQSession.checkClosed(ActiveMQSession.java:767)
    at org.apache.activemq.ActiveMQSession.createBrowser(ActiveMQSession.java:1425)
    at org.apache.activemq.jms.pool.PooledSession.createBrowser(PooledSession.java:294)
    at moss.jmx.TCAQueueSizeMonitor.getPendingQueueSize(TCAQueueSizeMonitor.java:63)
    at moss.jmx.TCAQueueSizeMonitor.getTCAQueueSizeStatus(TCAQueueSizeMonitor.java:101)
    at moss.jmx.TCAHeartBeatStatsCollector.run(TCAHeartBeatStatsCollector.java:60)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Session 被关闭一次,然后下面的异常不断出现:

[ 2014-12-19 00:00:06,176 [securityEventDataSubscriberContainer-4105] listener.DefaultMessageListenerContainer.handleListenerSetupFailure():842 WARN ]:目标“topic://check.newSecurityPublish”的 JMS 消息侦听器调用程序设置失败 -试图恢复。原因:org.apache.activemq.ConnectionFailedException:JMS 连接失败:连接被拒绝

[ 2014-12-19 00:00:06,476 [securityEventDataSubscriberContainer-4105] listener.DefaultMessageListenerContainer.refreshConnectionUntilSuccessful():891 INFO ]:成功刷新 JMS 连接

请注意,我们只为一位客户看到这种情况,有时也会出现这种情况。其他客户端能够与代理正常通信。

谢谢, 阿努杰

【问题讨论】:

    标签: spring activemq


    【解决方案1】:

    通常,客户端库不会使用代理实现自动重新连接选项。我从未与ActiveMQ 合作过,但我对RabbitMQ 有很好的经验,RabbitMQ 是另一台与 ActiveMQ 工作类似的服务器。我编写了代码来处理 C# 上的服务器断开连接。

    你必须做这些事情来实现它,C#和Java有相似的行为,所以你可以很容易地在java上实现它。

    1. 在主while循环中分别捕获Connection disconnect异常并进行处理。
    2. 在异常处理部分,您将尝试重新连接服务器并更新网络套接字和会话对象,以便您的程序可以照常恢复。
    3. 确保您重试了预定义的次数,然后您通过错误并退出程序。可能是服务器实际上已经死了。
    4. 您可以在第一次尝试连接代理时重用连接重新连接部分。
    5. 您可以使用异步方法(非阻塞函数调用)来更好地实现此功能。在 C# 中,这可以通过使用委托和异步调用来完成。

    希望这将帮助您处理问题。我对java的了解不多,所以无法提供代码示例来帮助您。

    【讨论】:

    • ActiveMQ 和 RabbitMQ 不是一回事,因此使用其中一个的经验不必与另一个相关。 ActiveMQ 有一个故障转移传输,它会在连接丢失时自动重试连接,即使 RabbitMQ 中没有这样的功能。
    • 感谢@Tim 的评论。故障转移传输很有趣。我去看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多