为什么我的 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。
我们正在努力使我们目前在 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。