从Websphere MQ中删除动态主题

时间:2016-02-07 12:02:44

标签: java jms ibm-mq

我有一个Java程序,它在创建时发布新的主题(订单)。更新订单后,将重新发布已更改的订单对象。以下示例代码;

Topic topic = topicSes.createTopic("/DepartmentA/ProjectB/Orders/"+ order.getOrderId());
TopicPublisher topicPub = topicSes.createPublisher(topic); 
ObjectMessage om = topicSes.createObjectMessage(order); 
om.setIntProperty(JmsConstants.JMS_IBM_RETAIN, JmsConstants.RETAIN_PUBLICATION); 
topicPub.send(om);

我发布了一个有害消息(参数为'DEAD'的消息对象),以便现有订阅者知道我们已经完成了。但是,我不明白的是,一旦完成主题,如何处理该主题,以便新的 订阅者不接受它?

在我的MQ Explorer会话(MQ Manager 7.5)上,我的主题列表为空。我认为这是因为主题是动态的。只有当我右键单击 [主题] 并选择 [状态...] 时,才能看到我的主题字符串。如果我右键单击主题字符串并选择 [清除本地保留发布...] ,主题最终会消失。我最后说,因为它不是立即的,它需要大约30分钟消失。

理想情况下,我想在JMS,MQ Java库或MQ PCF中以编程方式处理Topic String。我该怎么做呢? (我无法使用TemporaryTopics,因为发布过程可能会在订单的生命周期内下降/上升。)

我还尝试通过“runmqsc”查询和清除主题。我不明白的是;

DISPLAY TOPIC ;显示主题字符串的语法是什么 - 语法声明它应该是 DISPLAY TOPIC(主题)TOPICSTR(字符串),但对于给定的字符串“/ DepartmentA / ProjectB / Orders / 123”,我尝试了各种各样的组合,但没有什么对我有用。我似乎只能让它适用于经理主题。

对于 CLEAR TOPICSTR ,我可以放置任何东西作为Topic String参数,“runmqsc”永远不会抱怨,但即使字符串是正确的,它仍然无效。 CLEAR TOPICSTR的正确语法应该是什么?

我应该将“/ DepartmentA”作为托管主题吗?

2 个答案:

答案 0 :(得分:2)

默认TREELIFE为30分钟,您可以更改TREELIFE间隔。检查以下MQ信息中心URL以获取详细信息。

http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.pla.doc/q005060_.htm?lang=en

答案 1 :(得分:2)

您正确认识到主题字符串是动态的。你可能想读这个

https://www.ibm.com/developerworks/community/blogs/messaging/entry/mq_topics_but_which_type?lang=en

或观看此

https://www.youtube.com/watch?v=szqdtIEgTR4

他们应该解释你试图理解的概念。

如前所述,默认情况下,未使用的主题字符串将在30分钟后进行垃圾回收,这是为了节省资源。系统需要在创建时尽快删除它们,以确保系统不会过载。但是当没有人向他们发布时,让他们在那里不应该产生功能效果。

您应该意识到不断生成新主题字符串会产生开销,因此如果您创建并删除了数千个这样的字符串,您可能会看到它。

对于您的具体问题,请使用 DISPLAY TPSTATUS('字符串')来查看在MQExplorer中查看主题状态的等效内容(仅供参考,如果您想要通配符字符串你使用主题字符#或+)。

CLEAR TOPICSTR 只删除当前为主题字符串保留的任何保留消息。不能对具有关联的保留消息的主题字符串进行垃圾回收。如果您不使用保留的消息,则无效。

正如您从这些链接中看到的那样,如果您希望将其配置为与树的其余部分不同,或者您希望授予对该分支的特定访问权限,则只需将/ DepantmentA设为托管主题树。