Spring升级后IBM MQ Client-JMS连接池失效,连接数持续增长
问题:Spring Boot及IBM Jakarta库升级后MQ连接数持续增长
升级Spring Boot及相关IBM Jakarta库后,PST时段MQ Server的连接数不断攀升,怀疑IBM MQ Client的JMS连接池未正常工作,目前无法定位根因。出现以下错误后,连接数持续增长:
2024-12-30 07:43:31.446 [org.springframework.jms.JmsListenerEndpointContainer#1-15] INFO o.s.j.c.CachingConnectionFactory - Encountered a JMSException - resetting the underlying JMS Connection com.ibm.msg.client.jakarta.jms.DetailedTransactionRolledBackException: JMSCMQ0002: The method 'MQCMIT' failed. Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '1' ('MQCC_WARNING') reason '2003' ('MQRC_BACKED_OUT'). 2024-12-30 07:43:31.855 [org.springframework.jms.JmsListenerEndpointContainer#0-49] INFO o.s.j.c.CachingConnectionFactory - Encountered a JMSException - resetting the underlying JMS Connection com.ibm.msg.client.jakarta.jms.DetailedIllegalStateException: JMSCC0020: This session is closed.
排查方向与解决建议
1. 分析CachingConnectionFactory的重置逻辑
日志显示CachingConnectionFactory在捕获JMS异常后会重置底层连接。升级后的Spring Boot或IBM Jakarta库可能修改了异常触发重置的条件,导致每次异常都会创建新连接而未正确回收旧连接:
- 检查
resetConnectionOnException配置(默认值为true),如果这类异常频繁发生,会导致连接不断被丢弃重建。可根据业务场景调整该参数,或针对特定异常添加过滤逻辑。 - 验证缓存配置:确认
cacheConsumers、cacheProducers、sessionCacheSize参数是否合理,确保会话、生产者/消费者被正确缓存复用。
2. 处理MQRC_BACKED_OUT(2003)回滚异常
MQRC_BACKED_OUT表示事务被回滚,这是触发连接重置的直接原因之一:
- 检查消息监听器的事务配置,确认是否使用
@Transactional或Spring JMS事务管理器。如果事务回滚过于频繁,会持续触发连接重置逻辑。 - 排查消息处理逻辑,减少不必要的事务回滚,或针对这类回滚异常添加自定义异常处理,避免触发连接重置。
3. 追踪JMSCC0020会话关闭异常的根源
JMSCC0020: This session is closed表示尝试使用已关闭的会话,可能是连接池复用失效会话或连接重置时会话清理不彻底:
- 核对IBM MQ Client与Spring Boot的版本兼容性,升级后可能存在适配问题,导致会话生命周期管理异常。
- 启用Spring JMS调试日志(调整日志级别为
DEBUG),跟踪连接、会话的创建与销毁流程,确认是否存在连接未被正确回收的泄漏点。
4. 验证连接池配置合理性
如果使用IBM MQ自带连接池而非Spring的CachingConnectionFactory,需重点检查:
- 最大连接数、空闲超时、连接超时等参数是否符合业务负载,避免因参数不合理导致连接堆积。
- 连接池的异常回收机制,确认在捕获MQ异常时是否正确销毁连接并释放资源,而非直接丢弃。
内容的提问来源于stack exchange,提问作者vinoth gct
相关产品推荐
相关产品推荐

