JMS MQ 绑定问题

Posted

技术标签:

【中文标题】JMS MQ 绑定问题【英文标题】:JMS MQ binding problem 【发布时间】:2011-06-15 05:53:30 【问题描述】:

我在使用 MDB 的 MQ 队列上绑定 JMS 时遇到了这个奇怪的问题

消息驱动的 EJB:CrbEventMessageAsynchronousService 无法连接到 JMS 目标:queue.contratto.crb.input.publicQueue。错误是:

javax.jms.JMSException:MQJMS1017:非本地MQ队列对接收或浏览无效>

我检查了QueueManager,mq 队列被定义为本地,而不是异常所说的远程。

【问题讨论】:

【参考方案1】:

可能是应用程序打开以供读取的最顶层队列是在本地定义的。但是,WMQ 正在解析的队列不是。例如,如果您在远程集群队列上定义本地别名,则解析的队列是非本地的。另一个可能的原因是您打算为输出打开的队列实际上也正在为输入打开。这其实很常见。

最后,WMQ 客户端连接到与预期不同的队列管理器也很常见。例如,连接到 QMGRA,并且队列对象指定了一个完全限定的名称,如 QUEUE@QMGRB。即使队列位于 QMGRB 上,并且 JNDI 对象通过名称指定队列管理器,QMGRA 上的连接仍将其解析为传输队列,因此将其视为非本地的。

在 Dev 中确定此类错误的最佳方法之一是使用 SupportPac MA0W。此 SupportPac 作为 API 出口或通道出口运行,并以人类可读的语言列出所有 API 调用和为调用选择的所有选项。这将明确显示打开的对象名称、解析的对象以及使用的选项。

或者,您可以使用strmqtrc 打开跟踪。完成后不要忘记使用endmqtrc 禁用它!这些跟踪在 QMgr 服务器上启用和禁用,并跟踪 WMQ API 调用。可以在客户端运行等效的跟踪,但这些跟踪可能无法显示您需要的详细程度。

最后,建议打印与 JMS 异常相关的任何异常。 JMS 异常是一个多级数据结构,其中链接的异常包含特定于提供程序的值。例如,JMS 安全异常可能是 WMQ 授权错误。但话又说回来,这可能是密钥库或文件系统中的错误。如果链接的异常未显示 WMQ 2035 原因代码,则不是 WMQ 安全错误。信息中心在名为 Exceptions in WebSphere MQ classes for JMS 的部分中描述了如何打印链接的异常数据。

请注意,我提供了指向 v7.0 WMQ 文档的链接。如果您在 v6 中编码,这些可能不完全准确,您可能希望查看 v6.0 Infocenter。由于 WMQ 的 v6.0 已于 2011 年 9 月终止,因此强烈建议在 v7.0 上进行所有新开发。如果您需要 v7.0 客户端,可以将其下载为 SupportPac MQC7,并且向后兼容 v6.0 WMQ 服务器。

【讨论】:

非常感谢。问题出在这个建议中:“最后,WMQ 客户端连接到与预期不同的队列管理器也很常见”。实际上,这是一个应用问题。 MDB 定义 @ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "cont0QCFinter") 指向了指向错误队列管理器的错误连接工厂。亲切的问候。最大 啊,这就解释了。发生的事情比你想象的要多。很高兴你把它整理好了。

以上是关于JMS MQ 绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

jboss.jms 和 jboss.mq 有啥区别?

Websphere MQ 使用 JMS,关闭的连接卡在 MQ

JMS 传输与 MQ 传输

绑定内网和安全redis和mongo以及MQ

Java中动态声明与绑定Rabbit MQ队列以及延迟队列的实现与使用

Java中动态声明与绑定Rabbit MQ队列以及延迟队列的实现与使用