我've done some tests with ActiveMQ and Spring JMS. I'已配置 DefaultMessageListenerContainer
(DMLC)与 WorkManagerTaskExecutor
和CommonJ来管理线程 . 我想控制在服务器上运行的线程 .
我根据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”线程 . 它是否保持套接字打开?这些线程是强制性的吗
有关配置的详细信息:
-
使用的ConnectionFactory:org.apache.activemq.ActiveMQConnectionFactory
-
ActiveMQ版本:5.11.1
-
传输协议:TCP
-
使用DefaultMessageListenerContainer,客户端在循环中调用MessageConsumer.receive()方法 .
这似乎是一个愚蠢的问题,当然我误解了一些基本概念 .
1 回答
感谢Rob Davies在这个帖子_2731683中的解释,我明白所有与ActiveMQ的交互都需要每个连接一个TCP线程 .
但是,可以使用以下ConnectionFactories之一替换ActiveMQConnectionFactory来最小化传输线程的数量:
PooledConnectionFactory(ActiveMQ)
SingleConnectionFactory(spring-jms)
CachingConnectionFactory(spring-jms)