我们使用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.");
}
}
抱歉,发布下面的堆栈跟踪的长日志摘录,但也许有人会立即看到丢失的内容。
我们目前正在使用以下设置:
任何想法如何解决这个问题(以及如何格式化下面的日志)?
提前致谢!
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:连接重置
答案 0 :(得分:12)
听起来故障转移绝对是你想要使用的东西。您无需故障转移到另一个代理 - URI只是指示客户端库重新连接,因此您可以执行以下操作:
failover:(tcp://myBroker:61616)