我已经使用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线程。
正如您在图像中看到的,有ActimeMQ线程(不活动线程,传输线程等)。
当我执行测试时,我在日志中看到JMS消息由CommonJ线程而不是ActiveMQ线程处理,所以没关系。但是,我不明白为什么如果不使用ActiveMQ线程就会创建它们。特别是" ActiveMQ Transport"线程,因为对于我使用的每个队列,我都有一个线程" ActiveMQ Transport"。因此,如果我消耗了50个队列,我就得到50个" ActiveMQ Transport"的线程。它是否保持套接字打开?这些线程是强制性的吗
有关配置的详细信息:
这似乎是一个愚蠢的问题,当然我误解了一些基本概念。
答案 0 :(得分:0)
感谢Rob Davies在此帖子http://activemq.2283324.n4.nabble.com/ActimeMQ-Client-s-thread-management-td4705885.html中的解释,我了解到与ActiveMQ的所有交互都需要每个连接一个TCP线程。
但是,可以使用以下ConnectionFactories之一替换ActiveMQConnectionFactory来最小化传输线程的数量: