网络故障后重新连接到ActiveMQ服务器

时间:2013-06-05 13:05:33

标签: jms activemq

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

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

但是到目前为止我们无法管理,因为客户端似乎没有按预期自动重新连接到代理。 我们考虑在自己的TransportListener中自己实现它,但不建议这样做(参见Transport Listener and 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.");
    }
}

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

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

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

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

提前致谢!

  

2013-06-05 14:09:21,676 | main | Signal | DEBUG |等待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 | Running   WriteCheck [TCP://192.168.1.29:61616]   2013-06-05 14:09:36,945 | ActiveMQ   InactivityMonitor   WriteCheckTimer | AbstractInactivityMonitor | DEBUG | WriteChecker 6666 ms   自上次写入检查后已过去。   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   运输:   TCP://test-server/192.168.1.29:61616 @ 54127 | ThreadPoolUtils | DEBUG |关闭   ExecutorService:java.util.concurrent.ThreadPoolExecutor@13e0aba是   shutdown:true并终止:false take: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 Transport:   TCP://test-server/192.168.1.29:61616 @ 54127 | ActiveMQConnection | DEBUG |异步   没有异常监听器的异常:java.net.SocketException:   连接重置java.net.SocketException:连接重置为   java.net.SocketInputStream.read(未知来源)at   org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50)     在   org.apache.activemq.transport.tcp.TcpTransport $ 2.填写(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(未知来源)at   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(未知来源)at   org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50)     在   org.apache.activemq.transport.tcp.TcpTransport $ 2.填写(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(未知来源)at   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 |调试|停止   transport 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 =测试服务器/ 192.168.1.29,端口= 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<初始化>(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(未知来源)at   org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50)     在   org.apache.activemq.transport.tcp.TcpTransport $ 2.填写(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(未知来源)at   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(未知来源)at   org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50)     在   org.apache.activemq.transport.tcp.TcpTransport $ 2.填写(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(未知来源)at   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:连接重置

1 个答案:

答案 0 :(得分:12)

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

failover:(tcp://myBroker:61616)