持久订阅者未收到主题消息

时间:2012-03-06 11:50:26

标签: jms ibm-mq

我使用订阅者SYSTEM.JMS.D.SUBSCRIBER.QUEUE和客户端ID作为setClientID(“USER1”)并使用 topicSubscriber = topicSession.createDurableSubscriber(topic,“SUB1”);

topicSubscriber 已创建,在尝试使用此 topicSubscriber.receive(); 进行接收时,它未收到主题中的消息,但主题中有消息

任何人都可以说为什么它不接收消息以及我是否需要查询任何队列配置。

感谢任何帮助。

提前致谢。


我的编码中已经有了topicConnection.Start(),我在TopicSession中检查过没有Start()方法。

与非持久订阅者方法相同的代码 topicSession.createSubscriber(topic); 正在运行,但是对于持久性它不起作用。

由于


抱歉,是的,我的意思是topicConnection.Start()。值得一试。


我得到了耐用用户不工作的答案,  我的队列深度已达到最大队列深度,因此订阅者无法订阅该消息。

例如。队列SYSTEM.JMS.D.SUBSCRIBER.QUEUE的最大队列深度设置为100,如果我们检查当前队列深度,如果它达到100,则订户将无法工作。

作为尝试使用临时主题创建的替代方法,此处我在创建持久订阅者时遇到错误 topicSession.createDurableSubscriber(主题,“SUB1”);

  

JMS异常:: javax.jms.InvalidDestinationException:MQJMS0003:   目的地未被理解或不再有效

任何人都可以帮助解决此错误。

先谢谢。

1 个答案:

答案 0 :(得分:3)

问题似乎是您使用SYSTEM.JMS.D.SUBSCRIBER.QUEUE的方式。您似乎将此队列中的消息和订阅者定向为持久订阅的目标。 IBM MQ使用该队列来管理持久订阅。

作为一般规则,名称以SYSTEM开头的队列供MQ内部系统使用。其中一些(例如SYSTEM.ADMIN.*.EVENT)可以从中获取消息,但您也不会将这些消息用作不相关消息的订阅目标。

许多教程使用SYSTEM.DEFAULT.LOCAL.QUEUE作为消息的目标,但这只是因为已知所有版本的MQ上都存在该队列,并且MQ仅使用队列的定义而且从不该队列的内容。教程编写者(以及IBM在这里同样有罪)更容易指向SYSTEM.DEFAULT.LOCAL.QUEUE然后让学生了解创建自己的队列的需要和方法。因此,虽然最佳实践表明它不应该是“不使用SYSTEM对象”规则的例外,但常见的用法使SYSTEM.DEFAULT.LOCAL.QUEUE成为事实上的例外。

其他例外当然是MQ,MFT和IIB的命令队列。这些也是名称SYSTEM.*,但是专为用户与在队列中监听的软件进行通信而设计。

请注意,所有异常“不使用SYSTEM对象”规则是应用程序和MQ系统资源之间的接口。事件队列是MQ向用户发送信息。命令队列是用户向系统组件发送信息。订阅既不属于这些类别。订阅的目标被视为应用程序拥有的对象,即使系统代表订户管理它也是如此。

当您需要持久订阅时,要么让系统分配永久队列并使用它,要么预先定义队列(未命名为SYSTEM.*)并使用它。无论你做什么,请不要试图劫持MQ的内部系统队列以用于应用程序级目的。