会话回滚,回退和死信处理程序

时间:2012-12-21 13:15:51

标签: java ibm-mq

我正在使用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();
}

1 个答案:

答案 0 :(得分:3)

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

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

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

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

中的邮件

退出队列中的邮件没有预先修复的任何标头,如DLQ。你需要调查为什么消息会在那里结束。修复原因并将消息移回原始队列,以便将消息传递给应用程序。

相关问题