2

我在带有 MDB 的 MQ 队列上的 JMS 绑定有这个奇怪的问题

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

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

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

4

1 回答 1

4

应用程序打开以供读取的最顶层队列可能是在本地定义的。但是,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 信息中心。由于 WMQ 的 v6.0 已于 2011 年 9 月终止,因此强烈建议在 v7.0 上进行所有新开发。如果您需要 v7.0 客户端,它可以作为SupportPac MQC7下载,并且向后兼容 v6.0 WMQ 服务器。

于 2011-01-25T20:58:45.357 回答