3

我们正在使用 ActiveMQ 5.8.0 通过 TCP 将我们的 Java 应用程序连接到另一个系统。请求/回复(与对临时队列的回复同步)与我们的客户端及其相应部分配合良好。

但我们不确定如何处理“异常”情况,例如短暂的网络故障。我们正在测试套接字重新连接后应用程序是否可以继续正常工作。

但是直到现在我们都无法做到这一点,因为客户端似乎没有像预期的那样自动重新连接到代理。我们曾考虑在自己的 TransportListener 中实现它,但不建议这样做(请参阅Transport Listener 和 ActiveMq restart,其中 ActiveMQ 成员 Tim Bish 提示使用故障转移协议)。但是故障转移只是设法切换到另一个代理,如果一个坏了,对吧?

目前我们只使用 TransportListener 来监控日志文件中的连接状态,这会导致一些日志条目,如以下或类似(在下面的长日志中发布)。

ActiveMQ 连接执行器:...生产者收到:java.net.SocketException:...

class ConnectionStateMonitor
    implements TransportListener
{
    @Override
    public void onCommand(Object command)
    {
        logInfo("Producer received: " + command);
    }

    @Override
    public void onException(IOException exception)
    {
        logError("Producer received: " + exception);
    }

    @Override
    public void transportInterupted()
    {
        logError("Producer received transport interuption.");
    }

    @Override
    public void transportResumed()
    {
        logInfo("Producer received transport resumption.");
    }
}

抱歉,在下面发布了带有堆栈跟踪的长日志摘录,但也许有人会立即看到缺少的内容。

我们目前正在使用以下设置:

  • 线格式.maxInactivityDuration=20000
  • 回复的最大等待时间:10000 毫秒

任何想法如何解决这个问题(以及如何格式化下面的日志)?

提前致谢!

2013-06-05 14:09:21,676|main |Signal |DEBUG|Wait For 60000 2013-06-05 14:09:30,279|ActiveMQ InactivityMonitor WriteCheckTimer|AbstractInactivityMonitor|DEBUG|WriteChecker 6666 ms 自上次写入检查以来已过去。2013-06-05 14:09:30,282|ActiveMQ InactivityMonitor Worker|AbstractInactivityMonitor|DEBUG|运行 WriteCheck[tcp://192.168.1.29:61616] 2013-06-05 14:09:36,945|ActiveMQ InactivityMonitor WriteCheckTimer|AbstractInactivityMonitor|DEBUG |WriteChecker 自上次写入检查后已过去 6666 毫秒。2013-06-05 14:09:36,945|ActiveMQ InactivityMonitor Worker|AbstractInactivityMonitor|DEBUG|运行 WriteCheck[tcp://192.168.1.29:61616] 2013-06-05 14:09:40,579|ActiveMQ 传输:tcp:// test-server/192.168.1.29:61616@54127|ThreadPoolUtils|DEBUG|ExecutorService 关闭:java.util.concurrent。ThreadPoolExecutor@13e0aba 已关闭:true 并终止:false 耗时:0.000 秒。原因:javax.jms.JMSException:org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1391) 的 org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) 的连接重置。 apache.activemq.ActiveMQSession.syncSendPacket(ActiveMQSession.java:1912) 在 org.apache.activemq.ActiveMQMessageProducer.(ActiveMQMessageProducer.java:125) 在 org.apache.activemq.ActiveMQSession.createProducer(ActiveMQSession.java:956) 在 de。 wer.services.activemq.ActiveMqConnectionImpl.sendRequest(ActiveMqConnectionImpl.java:218) ... 4 更多 2013-06-05 14:09:40,579|ActiveMQ 传输:tcp://test-server/192.168.1.29:

4

1 回答 1

13

听起来故障转移绝对是您想要使用的东西。您不需要故障转移到另一个代理 - URI 只是指示客户端库重新连接,因此您可以执行以下操作:

failover:(tcp://myBroker:61616)
于 2013-06-05T14:57:26.507 回答