Websphere IBM MQ连接泄漏致线程阻塞问题排查求助
WebSphere MQ连接泄漏与类加载失败问题排查
问题背景
- 已配置WAS JMS池连接超时为5秒,读取JMS消息时通过finally块关闭连接,但连接未按超时设置释放,出现泄漏
- 无其他应用错误日志,仅通过指定跟踪字符串捕获到连接堆栈信息
使用的WAS跟踪字符串
=info: JMSApi=all: JMSServer=all: Messaging=all: JMS_WASTraceAdapter=all: com.ibm.mq.*=all: jmsApi=all: ConnLeakLogic=all: com.ibm.ejs.j2c.*=all
连接泄漏跟踪日志
Connection marked to be destroyed. Waiting for transaction end and connection close - MCWrapper id 53b353b3 Managed connection com.ibm.ejs.jms.JMSManagedQueueConnection@29422942 managed connection factory = com.ibm.ejs.jms.WMQJMSRAManagedConnectionFactory@70a470a4 physical connection = com.ibm.mq.jms.MQXAQueueConnection@44504450 connectorName = JMS$MIUFACTORY$JMSManagedConnection@11 credential = null open connection handles = [com.ibm.ejs.jms.JMSQueueConnectionHandle@655a655a] State:STATE_ACTIVE_INUSE Thread Id: 0000005f Thread Name: WebContainer : 5 Handle count 1 Start time inuse Wed Jan 18 16:00:18 GMT 2023 Time inuse 1479 (seconds) Connection marked to be destroyed. Waiting for transaction end and connection close - MCWrapper id 270b270b Managed connection com.ibm.ejs.jms.JMSManagedQueueConnection@1c921c92 managed connection factory = com.ibm.ejs.jms.WMQJMSRAManagedConnectionFactory@70a470a4 physical connection = com.ibm.mq.jms.MQXAQueueConnection@3c933c93 connectorName = JMS$MIUFACTORY$JMSManagedConnection@7 credential = null open connection handles = [com.ibm.ejs.jms.JMSQueueConnectionHandle@1c2f1c2f] State:STATE_ACTIVE_INUSE Thread Id: 00000035 Thread Name: WebContainer : 2 Handle count 1 Start time inuse Wed Jan 18 15:24:28 GMT 2023 Time inuse 3629 (seconds) Total number of connection in unshared pool: 2 Connection Leak Logic Information: MCWrapper id 53b353b3 Managed connection com.ibm.ejs.jms.JMSManagedQueueConnection@29422942 managed connection factory = com.ibm.ejs.jms.WMQJMSRAManagedConnectionFactory@70a470a4 physical connection = com.ibm.mq.jms.MQXAQueueConnection@44504450 connectorName = JMS$MIUFACTORY$JMSManagedConnection@11 credential = null open connection handles = [com.ibm.ejs.jms.JMSQueueConnectionHandle@655a655a] State:STATE_ACTIVE_INUSE Thread Id: 0000005f Thread Name: WebContainer : 5 Handle count 1 Start time inuse Wed Jan 18 16:00:18 GMT 2023 Time inuse 1479 (seconds) Last allocation time Wed Jan 18 16:00:18 GMT 2023 getConnection stack trace information: com.ibm.ejs.j2c.ConnectionManager.allocateConnection(ConnectionManager.java:900) com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle.createQueueConnection(JMSQueueConnectionFactoryHandle.java:84)
环境版本信息
- WebSphere版本:7.0.0.45
- MQ资源适配器版本:
- Implementation-Title: WebSphere MQ Resource Adapter
- Implementation-Version: 7.0.1.14
补充分析:类加载异常
经排查,连接泄漏由类加载失败触发,相关jar包已包含在EAR中,但出现ClassNotFoundException,堆栈如下:
java.net.URLClassLoader.findClass(URLClassLoader.java:457): at com.ibm.ws.bootstrap.ExtClassLoader.findClass(ExtClassLoader.java:201): at java.lang.ClassLoader.loadClass(ClassLoader.java:676): at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:112): at java.lang.ClassLoader.loadClass(ClassLoader.java:642): at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:62): at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:58): at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:545): at java.lang.ClassLoader.loadClass(ClassLoader.java:642): at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:513): at java.lang.ClassLoader.loadClass(ClassLoader.java:642): at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:545): at java.lang.ClassLoader.loadClass(ClassLoader.java:642): at
排查与解决方案建议
类加载问题修复
- 验证jar包完整性:检查EAR中对应的jar包是否损坏,重新打包替换,确保目标类文件存在于jar内
- 调整类加载策略:在WebSphere控制台中,将应用的类加载策略设置为
PARENT_LAST,避免父类加载器优先加载导致找不到自定义类 - 确认jar包位置:确保jar包放置在EAR的
APP-INF/lib目录(多模块应用场景),而非单个模块的WEB-INF/lib,保证应用类加载器可访问 - 排查类冲突:检查WebSphere全局库(如
lib/ext目录)是否存在同名类,避免加载错误版本的类
连接泄漏问题解决
- 优先修复类加载异常:类加载失败会导致finally块无法正常执行,进而无法关闭连接,解决
ClassNotFoundException是核心前提 - 增强连接关闭逻辑:在捕获
Throwable的代码块中执行连接关闭操作,确保即使出现Error(如类加载错误)也能释放连接:Connection conn = null; try { // 获取连接并处理JMS消息逻辑 } catch (Exception e) { // 异常处理逻辑 } finally { if (conn != null) { try { conn.close(); } catch (Exception ce) { // 记录连接关闭异常日志 } } } - 检查事务状态:日志显示连接在等待事务结束,通过WebSphere事务监控查看是否存在未提交/回滚的全局事务,及时清理挂起事务
- 升级版本补丁:WebSphere 7.0.0.45存在已知的JMS连接池泄漏问题,可升级至更高Fix Pack(如7.0.0.47及以上),同时升级MQ资源适配器到兼容版本
内容的提问来源于stack exchange,提问作者Harshal Patil
相关产品推荐
相关产品推荐

