首页 文章

DefaultMessageListenerContainer和ActiveMQ线程管理

提问于
浏览
0

我'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线程 .

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

    感谢Rob Davies在这个帖子_2731683中的解释,我明白所有与ActiveMQ的交互都需要每个连接一个TCP线程 .

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

    • PooledConnectionFactory(ActiveMQ)

    • SingleConnectionFactory(spring-jms)

    • CachingConnectionFactory(spring-jms)

相关问题