【发布时间】:2018-09-29 07:31:18
【问题描述】:
我在 Apache ServiceMix 上部署了一个 Web 服务,它使用 Apache Camel 调用 ActiveMQ 驱动的路由,使用类似于以下的代码:
context.createProducerTemplate().sendBody("activemq:startComplex", xml);
调用工作正常,但一段时间后,我的 Linux 机器上的文件描述符限制被击中。这些资源被一大堆(几千个)ActiveMQ 线程吃掉了。在jmx控制台下我可以看到很多类似下面的线程:
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)
和
Name: ActiveMQ Transport: tcp:///127.0.0.1:46420
State: RUNNABLE
Total blocked: 0 Total waited: 2
Stack trace:
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50)
org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:589)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58)
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)
以及如何摆脱挂线的想法?
【问题讨论】:
-
你在使用连接池吗?有多少客户端并行运行?如果您能提供有关该问题的更多详细信息,那就太好了。
-
我尝试启用和禁用连接池,但这并不重要。问题是“调用”绑定的。每次调用都会留下一些“挂起”的线程。我可以通过连续几次(串行)调用网络服务来重现它。我还尝试为连接启用 soTimeout,如下所述:activemq.apache.org/tcp-transport-reference.html。当然没有效果。
-
您的客户端是否在通信结束时发送断开连接?您是只创建生产者还是同时拥有消费者?
-
我也有消费者。我注意到根据cwiki.apache.org/CAMEL/…,不鼓励频繁调用 createProducerTemplate。我通过保留对 ProducerTemplate(当然还有 ConsumerTemplate)的引用来摆脱它,但没有真正改变线程仍在泄漏。
标签: apache-camel activemq apache-servicemix