Apache camel 挂起ActiveMQ传输和连接线程

Apache camel 挂起ActiveMQ传输和连接线程,apache-camel,activemq,apache-servicemix,Apache Camel,Activemq,Apache Servicemix,我在Apache ServiceMix上部署了一个Webservice,它使用Apache Camel调用ActiveMQ驱动的路由,使用类似于以下代码: context.createProducerTemplate().sendBody("activemq:startComplex", xml); Name: ActiveMQ Transport: tcp://localhost/127.0.0.1:61616 State: RUNNABLE Total blocked: 0 Total

我在Apache ServiceMix上部署了一个Webservice,它使用Apache Camel调用ActiveMQ驱动的路由,使用类似于以下代码:

 context.createProducerTemplate().sendBody("activemq:startComplex", xml);
Name: ActiveMQ Transport: tcp://localhost/127.0.0.1:61616
State: RUNNABLE
Total blocked: 0  Total waited: 0

Stack trace: 
 java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:5    0)
org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:589)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:5    8)
org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:574)
java.io.DataInputStream.readInt(DataInputStream.java:370)
org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275)
org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:222)
org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214)
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:197)
java.lang.Thread.run(Thread.java:662)
调用工作正常,但过了一段时间,我的Linux机器上的文件描述符限制就达到了。这些资源被一大堆(几千)ActiveMQ线程占用。在jmx控制台下,我可以看到许多类似于以下内容的线程:

 context.createProducerTemplate().sendBody("activemq:startComplex", xml);
Name: ActiveMQ Transport: tcp://localhost/127.0.0.1:61616
State: RUNNABLE
Total blocked: 0  Total waited: 0

Stack trace: 
 java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:5    0)
org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:589)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:5    8)
org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:574)
java.io.DataInputStream.readInt(DataInputStream.java:370)
org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275)
org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:222)
org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214)
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:197)
java.lang.Thread.run(Thread.java:662)

以及如何摆脱挂线的想法?

请参阅此常见问题解答


您不应在每次发送邮件时创建新的生产者模板。如果您这样做了,请记住在使用后关闭它。

我通过放弃所有ProducerTemplate和ConsumerTemplate的使用,成功地解决了线程泄漏问题


我现在使用标准JMS API从ActiveMQ发送和接收消息

您正在使用连接池吗?有多少客户端并行运行?如果你能提供更多关于这个问题的细节,那就太好了。我尝试过启用和禁用连接池,但这并不重要。这些问题受到“调用”的约束。每次调用都会留下一些“悬而未决”的线程。我可以通过连续几次调用webservice(串行)来复制它。我还尝试为连接启用soTimeout,如下所述:。当然没有效果。你的客户是否在通信结束时发送断开连接?你是只创造生产者还是也有消费者?我也有消费者。我注意到,根据法律,不鼓励频繁调用createProducerTemplate。我通过保留对ProducerTemplate(当然还有ConsumerTemplate)的引用来消除它,但是没有什么真正改变线程仍然在泄漏。实际上我确实犯了错误,但正如在对原始问题的一个答复中所提到的那样,更改它(以便只创建一个ProducerTemplate和ConsumerTemplate)对正在创建的线程数没有任何影响。请提供有关此问题的更多详细信息,以真正帮助其他人。