提问者:小点点

代理重启后,订阅者无法永远连接


使用ActiveMQ-5.10。

重启经纪人后,客户端似乎无法恢复,永远吐槽。客户端抛出

[2014-12-18 18:17:58,852[StatsCollector-3]jmx.TCAQueueSizeMonitor.getPendingQueueSize():68 ERROR]:获取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)

会话关闭一次,然后在它之后不断出现以下异常:

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

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

请注意,我们只看到一个客户,有时也是如此。其他客户能够与经纪人正常沟通。

谢谢,阿努


共1个答案

匿名用户

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

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

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

希望这能帮助你处理这个问题。我对java了解不多,所以我不能提供代码示例来帮助你。