为什么我的 liberty 配置会导致未知对象名称错误?

Why does my liberty configuration result in an unknown object name error?

我们正在努力使我们目前在 WebSphere 上运行的项目也能在 Liberty 上运行。

在尝试让 MDB 工作时出现以下错误:JMSCMQ0001:IBM MQ 调用失败,compcode 为“2”('MQCC_FAILED'),原因为“2085”('MQRC_UNKNOWN_OBJECT_NAME')

server.xml的相关部分:

<jmsQueue id="jms/incomingRequestQueue" jndiName="jms/incomingRequestQueue">
    <properties.mqJms baseQueueName="QUEUEIN" />
</jmsQueue>

<jmsActivationSpec id="application-ear/application-war/InboundMDB"
    authDataRef="mqJms.auth">
    <properties.mqJms destinationRef="jms/incomingRequestQueue" destinationType="javax.jms.Queue"
        transportType="CLIENT"
        hostName="${mqconnection.hostName}" port="${mqconnection.port}"
        channel="${mqconnection.channel}"
        messageCompression="NONE"
        rescanInterval="5000"
        sslCipherSuite="${mqconnection.sslCipherSuite}"
        brokerControlQueue="${mqconnection.brokerControlQueue}" brokerSubQueue="${mqconnection.brokerSubQueue}"
        brokerCCSubQueue="${mqconnection.brokerCCSubQueue}" brokerCCDurSubQueue="${mqconnection.brokerCCDurSubQueue}"/>
</jmsActivationSpec>

Liberty 配置中的值取自 WebSphere。

我的问题是这个错误的原因是否只能是队列名称不正确,或者配置中是否缺少某些内容。

更新:原来解决方法是将destinationRef改成destination,加上useJNDI="true"

前段时间我正在迁移到 Open Liberty,也遇到了一些麻烦。我设法让它工作,但不能保证这对你有用,因为你的情况可能有点不同。

首先,仔细检查 baseQueueName="QUEUEIN" 是否正确(也许它区分大小写并且不匹配或某些东西,例如缺少某些前缀)。

也许设置正确的 queueManager 会有所帮助。

这是我的有效设置,它与您的设置几乎相同。

    <resourceAdapter id="mqJMS" location="..../wmq.jmsra-9.1.4.0.rar"/>

    <authData id="mqAlias" password="${env.MQ_PWD}" user="${env.MQ_USER}"/>


    <jmsActivationSpec authDataRef="mqAlias" id="app-name/MyMessageBean">
        <properties.mqJms destinationRef="jms/MyQ"
                           destinationType="javax.jms.Queue"
                           sslCipherSuite="${env.MQ_SSL_CIPHER_SUITE}"
                           channel="${env.MQ_CHANNEL}"
                           queueManager="${env.MQ_QUEUE_MANAGER}"
                           hostName="${env.MQ_HOST}" port="${env.MQ_PORT}"
                           transportType="CLIENT" />
    </jmsActivationSpec>


    <jmsQueue id="jms/MyQ" jndiName="jms/MyQ">
        <properties.mqJms baseQueueName="${env.MY_QUEUE}"
                           baseQueueManagerName="${env.MQ_QUEUE_MANAGER}" />
    </jmsQueue>


</server>

一般来说,原因代码 2085 表示在队列管理器上找不到引用的队列。

这个 IBM Article 可能很有用,尤其是 解决问题 部分,您可以在其中看到他们建议在这种情况下执行的操作的简短描述。

如果您查看 MQ 上的日志并且它似乎正在尝试打开名为 jms/incomingRequestQueue 的 MQ 对象,请尝试将 destinationRef 替换为 destinationLookup。一些为激活规范指定目的地的方法只是将值直接传递给 MQ,而不是在 JNDI 上下文中查找管理对象并获取正确的 属性。

参见 this table 中有关 destination 和 destinationLookup 之间关系的注释。 DestinationRef 是 Liberty 添加的 属性,我不确定它如何与资源适配器实际公开的属性相关,但可能使此切换变得不必要。这完全取决于您尝试在队列管理器上将哪个字符串查找为队列。

此外,对于可能遇到此问题并正在使用 destination 属性(可能与 JMS 1.1/Java EE 6 结合使用)的用户,其中 destinationLookup 不存在,您可以在激活规范中将 useJNDI="true" 指定为 属性 来解决此问题,请参阅上面链接的 table。