【问题标题】:Is there a Tool to modify durable JMS Topic Messages?是否有修改持久 JMS 主题消息的工具?
【发布时间】:2015-12-11 23:31:07
【问题描述】:

我们正在使用 Websphere MQ8 并考虑使用持久主题来实现发布和订阅模式。

我们已经在使用队列和 Hermes JMS-Browser 来纠正错误的队列消息。

我知道您可以使用 Hermes 订阅主题,但我认为您无法访问和修改已为特定客户端保留的消息。

所以我想知道 - 当客户端无法使用特定客户端应用程序的持久消息时,您如何处理问题,例如因为消息格式错误?

您是否必须删除此客户端的所有未送达消息?或者有什么工具可以做到这一点?

【问题讨论】:

    标签: jms ibm-mq jms-topic


    【解决方案1】:

    当存在持久消息时,您如何处理问题 客户端无法使用的特定客户端应用程序,例如 因为消息格式错误?

    消费应用程序(客户端)应该有适当的异常处理 它应该丢弃所有坏/毒消息。

    您是否必须删除此客户端的所有未送达消息?或者有什么工具可以做到这一点?

    消息一旦被 MQ 服务器自动删除 TTL(生存时间)到期。我们无法手动删除这些消息,因为 它们属于/意味着原始客户(这是一个持久的 订户)。

    以下链接很好地解释了 JMS 持久订阅的概念: https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html

    我还为该工具提供了以下示例代码,它记录(不删除)来自持久订阅主题的消息:

       InitialContext ctx = new InitialContext();
       Topic topic = (Topic)ctx.lookup("myJMSTopic1");
    
       TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx.lookup("topicConnFactory");
       TopicConnection topicConn = connFactory.createTopicConnection();
       topicConn.setClientID("myToolId1"); //Use a different client id than original subscriber
    
       TopicSession topicSession = topicConn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
    
       TopicSubscriber topicSubscriber = topicSession.createDurableSubscriber(topic, "myClientExistingDuraSubName"); // this is where you have to provide the original client's durable subscription name
    
       while(true) {
            Message message = topicSubscriber.receive();
            TextMessage txtMsg = (TextMessage)message;
            logger.info(txtMsg.getText());
       }
    

    【讨论】:

    • 我的问题是,当您获得 XA 事务回滚时,例如从您的数据库中,您无法再删除中毒消息,对吗?在这种情况下,主题也会回滚。然后一些工具会很好。听起来对我来说是一个很常见的问题,所以想知道没有标准的解决方案......
    • 我明白你的意思了,你能在你的 MDB 方法的代码中(在你的查询中)添加这个 XATransaction 代码吗?
    • 现在我们让 MDB 监听队列并随后写入数据库。但是听主题的时候代码会很相似。你的想法是什么?
    猜你喜欢
    • 2013-05-28
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多