JMS MQ绑定问题

时间:2011-01-25 14:31:45

标签: java jms ibm-mq mq

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

  

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

     

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

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

1 个答案:

答案 0 :(得分: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 Infocenter。由于WMQ的v6.0截止到2011年9月,因此强烈建议在v7.0上进行所有新开发。如果您需要v7.0客户端,则可以将其下载为SupportPac MQC7,并向后兼容v6.0 WMQ服务器。