【问题标题】:IJ000455: "Wrong ManagedConnectionFactory sent to allocateConnection" with IBM MQ Resource Adapter 9.2.5.0IJ000455:使用 IBM MQ 资源适配器 9.2.5.0 “将错误的 ManagedConnectionFactory 发送到 allocateConnection”
【发布时间】:2022-06-16 16:02:12
【问题描述】:

我在 Wildfly 20.0.0 中配置了 IBM MQ 资源适配器 9.2.5.0,如下:

                <resource-adapter id="wmq.jmsra.rar">
                    <archive>
                        wmq.jmsra.rar
                    </archive>
                    <transaction-support>XATransaction</transaction-support>
                    <connection-definitions>
                        <connection-definition class-name="com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl" jndi-name="jms/IBMMQ_CONNECTIONFACTORY" pool-name="ibmmq-connection-definition">
                            <config-property name="hostName">${env.HOSTNAME}</config-property>
                            <config-property name="port">${env.PORT}</config-property>
                            <config-property name="channel">${env.CHANNEL}</config-property>
                            <config-property name="transportType">CLIENT</config-property>
                            <config-property name="queueManager">${env.QUEUE_MANAGER}</config-property>
                        </connection-definition>
                    </connection-definitions>
                </resource-adapter>

使用此连接工厂创建 MQ 连接时,出现以下错误:

MQJCA1011: Failed to allocate a JMS connection
...
Caused by: javax.resource.ResourceException: IJ000455: Wrong ManagedConnectionFactory sent to allocateConnection (Pool=com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl@f85b573c, MCF=com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl@f85b573c)
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:784) ~[?:?]
    at com.ibm.mq.connector.outbound.ConnectionFactoryImpl.createManagedJMSConnection(ConnectionFactoryImpl.java:309)

【问题讨论】:

    标签: wildfly ibm-mq resource-adapter


    【解决方案1】:

    AbstractConnectionManager.allocateConnection() 中,两个ManagedConnectionFactoryImpl 实例(池和MCF)使用equals() 进行比较。即使这两个实例实际上是相同的(哈希码 f85b573c,所以== 比较将返回true),equals() 返回false,即equals() 的实现com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl 违反了@987654330 的合同@。这样做是因为它使用== 而不是Objects.equals(..., ...) 比较Integer 值。相应的属性是int 类型,但使用的getter 返回Integer。当自动装箱 int 值时,Integer.valueOf() 在内部使用。这会在每次调用超出范围 [-128...127] 的值时返回新实例。

    为了解决这个问题,我不得不回退到 IBM MQ 资源适配器的 9.2.4.0 版本。

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2019-07-17
      相关资源
      最近更新 更多