DefaultMessageListenerContainer和ActiveMQ线程管理

时间:2016-01-08 14:20:14

标签: spring jms activemq

我已经使用ActiveMQ和Spring JMS完成了一些测试。我已使用DefaultMessageListenerContainer和CommonJ配置WorkManagerTaskExecutor(DMLC)来管理线程。我想控制服务器中运行的线程。

我根据Juergen Holler在Spring的论坛上发表的帖子做出了使用DMLC的决定:http://forum.spring.io/forum/other-spring-related/remoting/24208-what-s-the-best-practice-for-using-jms-in-spring?p=256420#post256420

在这篇文章中,他说" DMLC是唯一没有将线程管理强加到JMS提供程序的侦听器容器,也就是说,不使用/阻止JMS提供程序线程。"所以我认为所有线程都将由服务器管理,并且不会是ActiveMQ的线程。

然而,使用JConsole分析服务器的线程,我已经看到了一些我没想到的ActiveMQ线程。

enter image description here

正如您在图像中看到的,有ActimeMQ线程(不活动线程,传输线程等)。

当我执行测试时,我在日志中看到JMS消息由CommonJ线程而不是ActiveMQ线程处理,所以没关系。但是,我不明白为什么如果不使用ActiveMQ线程就会创建它们。特别是" ActiveMQ Transport"线程,因为对于我使用的每个队列,我都有一个线程" ActiveMQ Transport"。因此,如果我消耗了50个队列,我就得到50个" ActiveMQ Transport"的线程。它是否保持套接字打开?这些线程是强制性的吗

有关配置的详细信息:

  • 使用的ConnectionFactory:org.apache.activemq.ActiveMQConnectionFactory
  • ActiveMQ版本:5.11.1
  • 传输协议:TCP
  • 使用DefaultMessageListenerContainer,客户端在循环中调用MessageConsumer.receive()方法。

这似乎是一个愚蠢的问题,当然我误解了一些基本概念。

1 个答案:

答案 0 :(得分:0)

感谢Rob Davies在此帖子http://activemq.2283324.n4.nabble.com/ActimeMQ-Client-s-thread-management-td4705885.html中的解释,我了解到与ActiveMQ的所有交互都需要每个连接一个TCP线程。

但是,可以使用以下ConnectionFactories之一替换ActiveMQConnectionFactory来最小化传输线程的数量:

  • PooledConnectionFactory(ActiveMQ)
  • SingleConnectionFactory(spring-jms)
  • CachingConnectionFactory(spring-jms)