Jms 持久订户未从主题接收消息

Jms 持久订户未从主题接收消息,jms,ibm-mq,Jms,Ibm Mq,我使用Subscriber SYSTEM.JMS.D.Subscriber.QUEUE和客户端ID作为setClientID(“USER1”),并使用topicSubscriber=topicSession.createDurableSubscriber(主题“SUB1”) topicSubscriber已创建,在尝试使用此topicSubscriber.receive();)接收时,它没有从topic接收消息,但topic中有消息 任何人都可以说为什么它不接收消息,以及我是否需要检查任何队列配

我使用Subscriber SYSTEM.JMS.D.Subscriber.QUEUE和客户端ID作为setClientID(“USER1”),并使用topicSubscriber=topicSession.createDurableSubscriber(主题“SUB1”)

topicSubscriber已创建,在尝试使用此topicSubscriber.receive();)接收时,它没有从topic接收消息,但topic中有消息

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

感谢您的帮助

提前谢谢


我的代码中已经有了topicConnection.Start(),而且我还签入了TopicSession没有Start()方法

与非持久订户方法topicSession.createSubscriber(主题)相同的代码;它在起作用,但就持久性而言,它不起作用

谢谢


对不起,是的,我是说topicConnection.Start()。值得一看


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

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

作为我尝试使用临时主题创建的另一种方法,这里我在创建持久订户topicSession.createDurableSubscriber(主题“SUB1”)时出错

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

任何人都可以帮助解决这个错误


提前感谢。

问题似乎在于如何使用
SYSTEM.JMS.D.SUBSCRIBER.QUEUE
。您似乎正在将消息和订阅服务器定向到此队列作为持久订阅的目标。IBM MQ使用该队列管理持久订阅

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

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

当然,其他例外是MQ、MFT和IIB的命令队列。它们也是名称
SYSTEM.*
,但设计用于用户与在队列上侦听的软件进行通信

请注意,所有例外“不使用
系统
对象”规则都是应用程序和MQ系统资源之间的接口。事件队列正在向用户发送信息。命令队列是向系统组件发送信息的用户。订阅不属于这两个类别。订阅的目标被视为应用程序拥有的对象,即使系统代表订阅服务器管理它


如果需要持久订阅,请让系统分配一个永久队列并使用该队列,或者预先定义一个队列(未命名为
system.*
)并使用该队列。无论您做什么,请不要为了应用程序级目的而劫持MQ的内部系统队列。

您是否调用了topicSession.start()?这是JMS应用程序中缺少的一个常见步骤。会话启动前不会传递任何消息。请不要将答案作为问题的后续内容发布,而是编辑问题。所以这不是一个论坛,而是一个问答引擎。上面的问题,下面的答案(按选票排序)。