Wildfly 20配置IBM MQ资源适配器9.2.5.0报IJ000455错误咨询
错误原因
IJ000455: Wrong ManagedConnectionFactory sent to allocateConnection是Wildfly内置IronJacamar连接管理器的标准校验报错:分配连接时,容器会校验调用方传入的ManagedConnectionFactory(简称MCF)实例,和连接池初始化时绑定的MCF实例是否逻辑相等。
日志中两个实例打印的对象哈希值完全一致却仍然触发报错,核心诱因有两点:
- IBM MQ 9.2.5.0版本自带的
wmq.jmsra.rar存在已知实现缺陷:com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl类没有遵守JCA规范要求实现equals()和hashCode()方法,默认继承自Object的引用相等逻辑,在Wildfly对MCF做Javassist代理包装后会出现校验误判。 - 当前配置缺少类加载隔离设置,如果MQ适配器类同时被容器类加载器和应用类加载器加载,哪怕全限定类名完全相同,也会被判定为非同一类实例,触发校验失败。
配置调整方案
按以下顺序调整配置即可解决问题:
- 在
<resource-adapter>标签内,和<archive>、<transaction-support>同级,添加类加载隔离和Bean校验关闭配置,避免容器对MCF做不必要的代理增强:
<bean-validation-mode>NONE</bean-validation-mode> <class-loading> <ear-subdeployments-isolated>false</ear-subdeployments-isolated> </class-loading>
- 调整
<connection-definition>标签属性,补充XA事务场景的资源包装配置,修正实例匹配逻辑:
<connection-definition class-name="com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl" jndi-name="jms/IBMMQ_CONNECTIONFACTORY" pool-name="ibmmq-connection-definition" interleaving="false" same-rm-override="false" wrap-xa-resource="true" use-java-context="true">
- 在连接定义的config-property列表中添加CCDT地址的空声明,避免适配器初始化时自动生成额外MCF实例:
<config-property name="ccdtUrl"></config-property>
- 调整部署方式:不要将
wmq.jmsra.rar打包到业务应用的WAR/EAR包中,应该将其作为Wildfly全局模块部署到modules/system/layers/base/com/ibm/wmq/main/路径下,编写对应module.xml声明依赖后,将资源适配器配置中的<archive>wmq.jmsra.rar</archive>改为引用模块名,彻底规避类加载冲突。 - 如果上述配置调整后仍然复现问题,直接将IBM MQ资源适配器升级到9.2.5.1及更高的9.2.x补丁版本,IBM在该补丁中正式修复了MCF类的equals/hashCode实现缺陷,完全适配Wildfly的JCA校验逻辑。
内容的提问来源于stack exchange,提问作者Felix Siegrist
相关产品推荐
相关产品推荐

