在代理重启后,订户无法永久连接

时间:2014-12-22 11:08:06

标签: spring activemq

使用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]:JMS消息监听器调用程序的设置失败,目的地为'topic://check.newSecurityPublish' - 试图恢复。原因:org.apache.activemq.ConnectionFailedException:JMS连接失败:连接被拒绝

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

请注意,我们仅在一个客户端看到此信息,有时也会看到这一点。其他客户可以正确地与经纪人沟通。

谢谢, Anuj

1 个答案:

答案 0 :(得分:-1)

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

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

  1. 在主while循环中,分别捕获Connection断开异常并处理它。
  2. 在异常处理部分是您尝试与服务器重新连接并更新网络套接字和会话对象的位置,因此您可以照常恢复程序。
  3. 确保您正在重试预定义的次数,之后您将通过错误并退出程序。可能是服务器实际上已经死了。
  4. 当您尝试与代理连接时,您可以在第一次重用连接重新连接部分。
  5. 您可以使用Async方法(非阻塞函数调用)来更好地实现此功能。在C#中,这可以通过使用委托和异步调用来完成。
  6. 希望这可以帮助您解决问题。我没有太多的Java曝光,所以我无法提供代码示例来帮助你。