0

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

1 回答 1

3

出于几个原因,MQ JMS 提供程序可以将消息回退到回退队列或死信队列。他们之中有一些是

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

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

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

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

于 2012-12-21T16:49:31.457 回答