Apache ActiveMQ Artemis高并发消息发送后无响应问题求助
排查Apache ActiveMQ Artemis 2.29.0批量发送消息后挂起问题
客户端发送逻辑排查
- 检查JmsTemplate并行发送实现:JmsTemplate默认每次发送创建新会话,3万条并行发送可能瞬间创建大量连接/会话,耗尽Broker线程资源。需确认是否配置了JMS连接池,比如使用
CachingConnectionFactory封装ActiveMQConnectionFactory,限制最大连接数、会话数,避免无限制创建资源。 - 检查资源释放逻辑:确认发送代码无未释放的会话、连接资源,尽管JmsTemplate会自动管理,但高并发场景下配置不当仍可能引发泄漏。
Broker配置(broker.xml)排查
- 连接与线程池配置:
- 检查
acceptor的connectionsAllowed属性:若未限制连接数,客户端瞬间发起大量连接会占满NIO线程,导致Broker无法处理CLI连接请求。建议根据服务器CPU核心数设置合理值(如CPU核心数*10)。 - 核查
thread-pools下的server、client线程池max-pool-size:若线程池过小,批量消息会导致任务积压,Broker线程阻塞无响应。
- 检查
- 持久化与队列配置:
- 检查文件存储的
journal-buffer-size、journal-file-size:批量发送时磁盘IO跟不上会阻塞Journal线程,建议调大journal-buffer-size(如从默认4MB改为16MB),优先使用SSD存储。 - 确认
address-settings中的max-size-bytes、page-size-bytes:若队列消息累积超过阈值触发分页,不合理的分页配置会引发IO阻塞,需确保page-size-bytes足够减少分页频率。
- 检查文件存储的
- 管理线程配置:CLI连接依赖Broker管理线程,若
management-thread-pool大小不足,会导致无法响应CLI命令,需检查该线程池的max-pool-size配置。
运行时状态排查
- 通过JMX查看状态:用jconsole连接Broker默认JMX端口(1099),查看线程池负载、队列消息数、连接数、会话数,定位是否有线程阻塞或资源耗尽。
- 检查系统文件句柄:Linux环境下执行
ulimit -n确认当前限制,Broker处理大量连接、文件时可能耗尽句柄,导致无法创建新连接(含CLI连接),建议将文件句柄数调至65535以上。 - 生成线程栈分析:执行
jstack <Broker进程ID>获取线程dump,排查是否有线程阻塞在IO操作、锁竞争上,比如Journal写入线程是否长期阻塞。
官方perf client对比分析
artemis perf client采用池化连接/会话,发送逻辑经过优化,不会瞬间创建大量连接,这是它能正常运行的核心原因。你的Spring Boot代码若未做连接池优化,会引发连接数暴增,导致Broker资源耗尽。
内容的提问来源于stack exchange,提问作者titanium
相关产品推荐
相关产品推荐

