我们正在尝试使当前在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”

最佳答案

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

有关destination和destinationLookup之间的关系,请参见this table中的注释。 DestinationRef是Liberty添加的一个属性,我不确定它是否与资源适配器实际公开的属性有什么关系,但可能使此开关不必要。这完全取决于您要在队列管理器上作为队列查找的字符串。

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

10-08 19:50