You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActiveMQ Artemis嵌入Tomcat出现Netty线程异常排查求助

异常成因分析:Tomcat重启后ActiveMQ Artemis客户端的Netty线程问题

核心成因线索

1. 线程泄漏触发类加载器非法访问

第二个异常直接暴露Web应用已停止,但Netty线程仍在运行的问题:

  • 旧Web应用的EpollEventLoop线程由ActiveMQThreadFactory创建,Web应用停止后未被销毁,持续持有旧的WebappClassLoader引用。
  • 当线程执行closeAll()清理资源时,尝试加载io.netty.util.collection.IntObjectHashMap$2,但此时Tomcat已标记该类加载器不可用,触发非法访问异常。

2. 终止的线程池接收任务被拒绝

第一个异常executor not accepting a task的本质:

  • Web应用停止时,Artemis客户端关联的Netty EventLoopExecutor已被终止,但仍有残留的连接请求或异步回调任务提交到该线程池。
  • 这些残留任务通常来自未正确关闭的Artemis客户端连接,或延迟执行的异步操作,在线程池终止后提交导致被拒绝。

3. 嵌入式Artemis生命周期未与Web容器绑定

嵌入式部署的关键疏漏:

  • 若未在Web应用销毁阶段(如ServletContextListener.contextDestroyed回调)显式调用Artemis客户端/实例的close()或stop()方法,Tomcat停止Web应用时,Artemis的线程池、Netty EventLoop等资源不会自动清理。
  • ActiveMQ Artemis 2.5.0版本存在容器环境下的生命周期管理缺陷,客户端侧资源释放逻辑未适配Web容器的销毁流程。

4. Netty资源清理时机滞后

Netty的EpollEventLoop资源清理动作在Web应用停止后才触发:

  • 线程池关闭逻辑未与Web应用生命周期同步,导致清理操作执行时,类加载环境已被Tomcat破坏,进而引发类加载异常,同时残留线程继续运行导致后续任务提交失败。

验证与排查方向

  • 检查Web应用的销毁逻辑,确认是否在上下文销毁时主动关闭Artemis客户端实例和连接池。
  • 排查Artemis客户端配置,确保连接池设置了合理的空闲超时、连接关闭钩子。
  • 考虑升级ActiveMQ Artemis到较新版本(2.5.0为旧版本,后续修复了大量容器环境下的资源泄漏问题)。

内容的提问来源于stack exchange,提问作者bleepbloop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:47:43