【问题标题】:Hanging ActiveMQ Transport and Connection threads挂起 ActiveMQ 传输和连接线程
【发布时间】: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


【解决方案1】:

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

您不应在每次发送消息时都创建新的生产者模板。如果你这样做了,那么记得在使用后关闭它。

【讨论】:

  • 实际上我确实犯了错误,但正如对更改它的原始问题的回复之一中提到的那样(因此只创建了一个 ProducerTemplate 和 ConsumerTemplate)对数量没有任何影响正在创建线程。
【解决方案2】:

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

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

【讨论】:

  • 请您提供有关此问题的更多详细信息,这将真正帮助其他人。
猜你喜欢
  • 2013-02-24
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多