我们正在尝试使当前在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"
指定为属性来解决此问题,请参阅上方的表格。