【问题标题】:Session rollback, backout and dead-letter handler会话回滚、回退和死信处理程序
【发布时间】:2012-12-22 00:49:31
【问题描述】:

我正在使用 MQQueueSession.rollback() 来回滚工作单元。消息被移到 BACKOUT 队列中,没关系。

问题是如何处理回退队列中的这些消息?我读到我可以使用 runmqdlq 工具,但它只适用于以 MQDLH 为前缀的消息。简单的 MQQueueSession.rollback() 似乎没有这样做。我做错了什么?

代码示例:

MQQueueConnection connection;
// ...
MQQueueSession session = (MQQueueSession) connection.createQueueSession(true, Session.SESSION_TRANSACTED);
MQQueue queue = (MQQueue) session.createQueue("queue:///TEST");
MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue);
JMSTextMessage message = null;

try {
    message = (JMSTextMessage) receiver.receive();
    // ...
    session.commit();
} catch (JMSException e) {
    session.rollback();
    e.printStackTrace();
}

【问题讨论】:

    标签: java ibm-mq


    【解决方案1】:

    由于某些原因,MQ JMS 提供程序可以将消息回退到回退队列或死信队列。其中一些是

    1) 格式错误的消息
    2) 客户端应用程序未通过在事务处理会话中执行Commit 或在客户端确认会话中执行Message.Acknowledge() 来确认消息。在这种情况下,将重新传递消息。如果一次又一次地传递相同的消息,MQ JMS 提供程序会根据队列上的BOTHRESH 设置将该消息移出队列。

    以上称为“毒消息”处理。

    很多时候,队列可能没有定义退出队列 (BOQUEUE)。在这种情况下,MQ JMS 提供程序将有害消息移动到死信队列 (DLQ),并以 DLQ 标头为前缀。您可以使用runmqdlq 处理DLQ 中的消息。

    回退队列中的消息没有像DLQ 这样的前缀。您需要调查为什么消息会在那里结束。修复原因并将消息移回原始队列,以便可以将消息传递给应用程序。

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 1970-01-01
      • 2012-01-08
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2011-06-20
      相关资源
      最近更新 更多