网络故障后重新连接到ActiveMQ服务器 [英] Reconnect to ActiveMQ server after network failure

查看:786
本文介绍了网络故障后重新连接到ActiveMQ服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

we are using ActiveMQ 5.8.0 to connect our Java application via TCP to another system. Request/reply (synchronous with reply to temporary queue) works fine with our client and its corresponding part.

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

But we are not sure about how to handle "abnormal" situations like e.g. a short network failure. We are testing if the application can continue its work normally after socket reconnect.

但是直到现在我们还是无法解决这个问题,因为客户端似乎没有按预期自动重新连接到代理. 我们曾考虑过自己在自己的TransportListener内启用它,但不建议这样做(请参见 Transport Listener和ActiveMq重新启动,其中ActiveMQ成员Tim Bish暗示使用故障转移协议. 但是,如果一个代理发生故障,故障转移只是设法切换到另一个代理,对吗?

But until now we couldn't manage that because the client seems not to automatically reconnect to the broker as expected. We thought about implenting it by ourselves inside an own TransportListener, but this is not recommended (see Transport Listener and ActiveMq restart, where ActiveMQ member Tim Bish hints to use the failover protocol). But the failover just manages to switch to another broker, if one is down, right?

当前,我们仅使用TransportListener来监视日志文件中的连接状态,这会导致一些日志条目,例如following或类似的日志(在下面的长日志中发布).

Currently we are using the TransportListener only to monitor the connection state in the log file, which leads to some log entries like following or similar (posted in long log below).

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

ActiveMQ Connection Executor: ... Producer received: 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.");
    }
}

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

Sorry, for posting a long log excerpt with stacktraces below, but maybe someone immediately sees what is missing.

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

We are currently working with following settings:

  • wireFormat.maxInactivityDuration = 20000
  • 最长等待回复时间:10000毫秒

有什么想法可以解决该问题(以及如何格式化下面的日志)?

Any ideas how to solve that problem (and how to format pretty the log below) ?

提前谢谢!

2013-06-05 14:09:21,676 |主要|信号|调试|等待60000 2013-06-05 14:09:30,279 | ActiveMQ InactivityMonitor WriteCheckTimer | AbstractInactivityMonitor | DEBUG | WriteChecker 6666毫秒 自上次写检查以来已过去. 2013-06-05 14:09:30,282 | ActiveMQ InactivityMonitor工作者| AbstractInactivityMonitor |调试|正在运行 WriteCheck [tcp://192.168.1.29:61616] 2013-06-05 14:09:36,945 | ActiveMQ 不活动监视器 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是 shutdown:正确并终止:false花费了0.000秒.造成原因: javax.jms.JMSException:在以下位置重置连接 org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) 在 org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1391) 在 org.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:61616 @ 54127 | ActiveMQConnection | DEBUG | Async 没有异常侦听器的异常:java.net.SocketException: 连接重置java.net.SocketException:连接重置在 java.net.SocketInputStream.read(未知源) org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) 在 org.apache.activemq.transport.tcp.TcpTransport $ 2.fill(TcpTransport.java:604) 在 org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) 在 org.apache.activemq.transport.tcp.TcpTransport $ 2.read(TcpTransport.java:589) 在java.io.DataInputStream.readInt(未知源)在 org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) 在 org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) 在 org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) 在 org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) 在java.lang.Thread.run(未知源)造成原因: java.net.SocketException:连接重置于 java.net.SocketInputStream.read(未知源) org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) 在 org.apache.activemq.transport.tcp.TcpTransport $ 2.fill(TcpTransport.java:604) 在 org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) 在 org.apache.activemq.transport.tcp.TcpTransport $ 2.read(TcpTransport.java:589) 在java.io.DataInputStream.readInt(未知源)在 org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) 在 org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) 在 org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) 在 org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) ...还有1个 2013-06-05 14:09:40,583 | ActiveMQ连接执行器: tcp://test-server/192.168.1.29:61616 @ 54127 | TcpTransport | DEBUG |停止 传输tcp://test-server/192.168.1.29:61616 @ 54127 2013-06-05 14:09:40,583 | ActiveMQ连接执行器: tcp://test-server/192.168.1.29:61616 @ 54127 | TaskRunnerFactory | DEBUG |已初始化 使用ExecutorService的TaskRunnerFactory [ActiveMQ Task]: java.util.concurrent.ThreadPoolExecutor@186f247 2013-06-05 14:09:40,584 | ActiveMQ Task-1 | TcpTransport | DEBUG |关闭的套接字 套接字[addr = test-server/192.168.1.29,port = 61616,localport = 54127] 引起原因:javax.jms.JMSException:连接重置于 org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) 在 org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1391) 在 org.apache.activemq.ActiveMQSession.syncSendPacket(ActiveMQSession.java:1912) 在 org.apache.activemq.ActiveMQMessageProducer.< init>(ActiveMQMessageProducer.java:125) 在 org.apache.activemq.ActiveMQSession.createProducer(ActiveMQSession.java:956) 在 de.wer.services.activemq.ActiveMqConnectionImpl.sendRequest(ActiveMqConnectionImpl.java:218) ... 4更多原因:java.net.SocketException:连接重置于 java.net.SocketInputStream.read(未知源) org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) 在 org.apache.activemq.transport.tcp.TcpTransport $ 2.fill(TcpTransport.java:604) 在 org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) 在 org.apache.activemq.transport.tcp.TcpTransport $ 2.read(TcpTransport.java:589) 在java.io.DataInputStream.readInt(未知源)在 org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) 在 org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) 在 org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) 在 org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) ... 1更多2013-06-05 14:09:40,584 | ActiveMQ连接执行器: tcp://test-server/192.168.1.29:61616 @ 54127 | ThreadPoolUtils | DEBUG |强制 关闭ExecutorService: java.util.concurrent.ThreadPoolExecutor@186f247由以下原因引起: javax.jms.JMSException:在以下位置重置连接 org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) 在 org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1391) 在 org.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更多原因:java.net.SocketException:连接重置于 java.net.SocketInputStream.read(未知源) org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) 在 org.apache.activemq.transport.tcp.TcpTransport $ 2.fill(TcpTransport.java:604) 在 org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) 在 org.apache.activemq.transport.tcp.TcpTransport $ 2.read(TcpTransport.java:589) 在java.io.DataInputStream.readInt(未知源)在 org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) 在 org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) 在 org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) 在 org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) ... 1更多2013-06-05 14:09:40,587 | ActiveMQ连接执行器: tcp://test-server/192.168.1.29:61616 @ 54127 | ActiveMqConnectionImpl | ERROR |生产者收到:java.net.SocketException:连接重置

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 elapsed since last write check. 2013-06-05 14:09:30,282|ActiveMQ InactivityMonitor Worker|AbstractInactivityMonitor|DEBUG|Running WriteCheck[tcp://192.168.1.29:61616] 2013-06-05 14:09:36,945|ActiveMQ InactivityMonitor WriteCheckTimer|AbstractInactivityMonitor|DEBUG|WriteChecker 6666 ms elapsed since last write check. 2013-06-05 14:09:36,945|ActiveMQ InactivityMonitor Worker|AbstractInactivityMonitor|DEBUG|Running WriteCheck[tcp://192.168.1.29:61616] 2013-06-05 14:09:40,579|ActiveMQ Transport: tcp://test-server/192.168.1.29:61616@54127|ThreadPoolUtils|DEBUG|Shutdown of ExecutorService: java.util.concurrent.ThreadPoolExecutor@13e0aba is shutdown: true and terminated: false took: 0.000 seconds. Caused by: javax.jms.JMSException: Connection reset at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1391) at org.apache.activemq.ActiveMQSession.syncSendPacket(ActiveMQSession.java:1912) at org.apache.activemq.ActiveMQMessageProducer.(ActiveMQMessageProducer.java:125) at org.apache.activemq.ActiveMQSession.createProducer(ActiveMQSession.java:956) at de.wer.services.activemq.ActiveMqConnectionImpl.sendRequest(ActiveMqConnectionImpl.java:218) ... 4 more 2013-06-05 14:09:40,579|ActiveMQ Transport: tcp://test-server/192.168.1.29:61616@54127|ActiveMQConnection|DEBUG|Async exception with no exception listener: java.net.SocketException: Connection reset java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) at org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:604) at org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) at org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:589) at java.io.DataInputStream.readInt(Unknown Source) at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) at java.lang.Thread.run(Unknown Source) Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) at org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:604) at org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) at org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:589) at java.io.DataInputStream.readInt(Unknown Source) at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) ... 1 more 2013-06-05 14:09:40,583|ActiveMQ Connection Executor: tcp://test-server/192.168.1.29:61616@54127|TcpTransport|DEBUG|Stopping transport tcp://test-server/192.168.1.29:61616@54127 2013-06-05 14:09:40,583|ActiveMQ Connection Executor: tcp://test-server/192.168.1.29:61616@54127|TaskRunnerFactory|DEBUG|Initialized TaskRunnerFactory[ActiveMQ Task] using ExecutorService: java.util.concurrent.ThreadPoolExecutor@186f247 2013-06-05 14:09:40,584|ActiveMQ Task-1 |TcpTransport|DEBUG|Closed socket Socket[addr=test-server/192.168.1.29,port=61616,localport=54127] Caused by: javax.jms.JMSException: Connection reset at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1391) at org.apache.activemq.ActiveMQSession.syncSendPacket(ActiveMQSession.java:1912) at org.apache.activemq.ActiveMQMessageProducer.<init>(ActiveMQMessageProducer.java:125) at org.apache.activemq.ActiveMQSession.createProducer(ActiveMQSession.java:956) at de.wer.services.activemq.ActiveMqConnectionImpl.sendRequest(ActiveMqConnectionImpl.java:218) ... 4 more Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) at org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:604) at org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) at org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:589) at java.io.DataInputStream.readInt(Unknown Source) at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) ... 1 more 2013-06-05 14:09:40,584|ActiveMQ Connection Executor: tcp://test-server/192.168.1.29:61616@54127|ThreadPoolUtils|DEBUG|Forcing shutdown of ExecutorService: java.util.concurrent.ThreadPoolExecutor@186f247 Caused by: javax.jms.JMSException: Connection reset at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1391) at org.apache.activemq.ActiveMQSession.syncSendPacket(ActiveMQSession.java:1912) at org.apache.activemq.ActiveMQMessageProducer.(ActiveMQMessageProducer.java:125) at org.apache.activemq.ActiveMQSession.createProducer(ActiveMQSession.java:956) at de.wer.services.activemq.ActiveMqConnectionImpl.sendRequest(ActiveMqConnectionImpl.java:218) ... 4 more Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) at org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:604) at org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) at org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:589) at java.io.DataInputStream.readInt(Unknown Source) at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) ... 1 more 2013-06-05 14:09:40,587|ActiveMQ Connection Executor: tcp://test-server/192.168.1.29:61616@54127|ActiveMqConnectionImpl|ERROR|Producer received: java.net.SocketException: Connection reset

推荐答案

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

It sounds like failover is definitely the thing that you want to use. You don't need to failover to another broker - the URI simply instructs the client library to reconnect, so you can do something like:

failover:(tcp://myBroker:61616)

这篇关于网络故障后重新连接到ActiveMQ服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆