【问题标题】:Deleting Dynamic Topics from Websphere MQ从 Websphere MQ 中删除动态主题
【发布时间】:2016-02-08 16:38:39
【问题描述】:

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

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) 上,我的主题列表是空的。我认为这是因为主题是动态的。只有当我右键单击 [Topics] 并选择 [Status...] 时,我才能看到我的主题字符串。如果我右键单击主题字符串并选择 [Clear Local Retained Publication...],主题最终会消失。我最后说,因为它不是立即的,它需要大约 30 分钟消失。

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

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

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

对于CLEAR TOPICSTR,我可以将任何内容作为主题字符串参数,“runmqsc”从不抱怨,但即使字符串正确,它仍然什么都不做。 CLEAR TOPICSTR 的正确语法应该是什么?

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

【问题讨论】:

    标签: java jms ibm-mq


    【解决方案1】:

    默认 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

    【讨论】:

    • 谢谢!一个链接值一千字。
    【解决方案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('string') 来查看与在 MQExplorer 中查看主题状态的等价物(仅供参考,如果您想通配符使用主题字符的字符串# 或 +)。

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

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

    【讨论】:

    • 非常感谢您的回复。我想在阅读这些答案之前,我误解了一些事情。
      关于删除主题字符串; (a) MQ 删除主题字符串,而不是程序员 (b) 在我的实例中,我只能使主题可删除,但删除主题字符串的“保留”状态。
      我也误读了手册www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/…>,并没有意识到主题字符串需要被引用! RUNMQSC 从不抱怨……
    • 使用 runmqsc,如果你不引用,那么任何字符串本质上都会被转换为大写(并且不允许使用像“#”这样的特殊字符)。因此,将任何字符串放在引号内总是一个好主意。如果您过去向主题字符串发布了一条消息并请求保留该消息(不是默认值),您只需担心主题字符串的“保留状态”。
    猜你喜欢
    • 2017-03-09
    • 2011-05-29
    • 2014-05-06
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多