我使用订阅服务器SYSTEM.JMS.D.SUBSCRIBER.QUEUE和客户端ID作为setClientID("USER1"),并使用topicSubscriber =topicSession.createDurableSubscriber(主题"SUB1");
topicSubscriber是创建的,在尝试使用这个topicSubscriber.receive()接收消息时,它没有接收来自主题的消息,但是主题中有消息。
有谁能说为什么它没有接收到消息,以及我是否需要修改任何队列配置。
任何帮助都是非常感谢的。
提前谢谢。
我的编码中已经有了topicConnection.Start(),我也在TopicSession中签了名--这里没有Start()方法。
与非持久订阅服务器方法topicSession.createSubscriber(主题)相同的代码正在工作,但对于持久性,它不起作用。
谢谢
对不起,我是说topicConnection.Start()。值得一查。
我得到了持久订阅者无法工作的答案,我的队列深度已经达到最大队列深度,因此订阅者无法订阅消息。
例如。队列SYSTEM.JMS.D.SUBSCRIBER.QUEUE的最大队列深度设置为100,如果我们检查当前队列深度,如果达到100,订阅服务器将无法工作。
作为尝试用临时主题创建的另一种方式,在创建持久的订阅者topicSession.createDurableSubscriber(主题,“SUB1”)时,会出现一个错误;
JMS异常::javax.jms.InvalidDestinationException: MQJMS0003:目的地不被理解或不再有效
有人能帮我解决这个错误吗。
提前谢谢。
发布于 2015-06-18 17:04:48
问题似乎在于您如何使用SYSTEM.JMS.D.SUBSCRIBER.QUEUE
。您似乎正在将消息和订阅服务器定向到此队列,作为持久订阅的目标。IBM使用该队列来管理持久订阅。
通常情况下,名称以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的内部系统队列。
https://stackoverflow.com/questions/9583149
复制相似问题