我们正在使用 ActiveMQ 5.8.0 通过 TCP 将 Java 应用程序连接到另一个系统。
请求/回复(与对临时队列的回复同步)与我们的客户端及其相应部分配合良好。
但我们不确定如何处理“异常”情况,例如短暂的网络故障。
我们正在测试应用程序在套接字重新连接后是否可以正常继续工作。
但直到现在我们还无法做到这一点,因为客户端似乎没有按预期自动重新连接到代理。
我们考虑过在自己的 TransportListener 中自己实现它,但不建议这样做(请参阅传输侦听器和 ActiveMq 重新启动 https://stackoverflow.com/questions/14172547/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.");
}
}
抱歉,在下面发布了带有堆栈跟踪的长日志摘录,但也许有人会立即看到缺少的内容。
我们目前正在使用以下设置:
- 线格式.maxInactivityDuration=20000
- 回复的最长等待时间:10000 毫秒
有什么想法可以解决这个问题(以及如何格式化下面的日志)?
提前致谢!
2013-06-05 14:09:21,676|main |信号|DEBUG|等待60000
2013-06-05 14:09:30,279|ActiveMQ InactivityMonitor
WriteCheckTimer|AbstractInactivityMonitor|调试|WriteChecker 6666 毫秒
自上次写检查以来已过去。
2013-06-05 14:09:30,282|ActiveMQ
InactivityMonitor Worker|AbstractInactivityMonitor|DEBUG|正在运行
写检查[tcp://192.168.1.29:61616]
2013-06-05 14:09:36,945|ActiveMQ
不活动监视器
WriteCheckTimer|AbstractInactivityMonitor|调试|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|调试|关闭
ExecutorService: java.util.concurrent.ThreadPoolExecutor@13e0aba 是
关闭: true 和终止: 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|调试|异步
没有异常监听器的异常: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|调试|停止
传输 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|调试|初始化
使用 ExecutorService 的 TaskRunnerFactory[ActiveMQ Task]:
java.util.concurrent.ThreadPoolExecutor@186f247
2013-06-05 14:09:40,584|ActiveMQ 任务 1 |TcpTransport|DEBUG|关闭套接字
套接字[地址=测试服务器/192.168.1.29,端口=61616,本地端口=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(来源未知)位于
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|调试|强制
关闭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|错误|生产者收到:java.net.SocketException:连接重置