4

我在 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)

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

4

2 回答 2

2

请参阅此常见问题解答 http://camel.apache.org/why-does-camel-use-too-many-threads-with-producertemplate.html

您不应在每次发送消息时都创建新的生产者模板。如果这样做,请记住在使用后将其关闭。

于 2012-05-12T14:06:00.560 回答
2

通过放弃对 ProducerTemplate 和 ConsumerTemplate 的所有使用,我设法摆脱了线程泄漏问题。

我现在使用标准 JMS API 来发送和接收来自 ActiveMQ 的消息。

于 2012-05-14T11:20:24.387 回答