我正在使用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();
}
答案 0 :(得分:3)
MQ JMS提供程序可以将消息退回到退出队列或死信队列,原因如下。其中一些是
1)格式错误的消息
2)客户端应用程序未通过事务会话中的Commit
或客户端确认的会话中的Message.Acknowledge()
确认消息。在这种情况下,重新传递消息。如果一次又一次地传递相同内容,MQ JMS提供程序会根据队列上的BOTHRESH
设置将该消息移出到退出队列。
以上称为“毒药消息”处理。
很多时候,队列可能没有定义退出队列(BOQUEUE
)。在这种情况下,MQ JMS提供程序将有害消息移动到前缀为DLQ标头的死信队列(DLQ
)。您可以使用runmqdlq
来处理DLQ
。
退出队列中的邮件没有预先修复的任何标头,如DLQ
。你需要调查为什么消息会在那里结束。修复原因并将消息移回原始队列,以便将消息传递给应用程序。