繁体   English   中英

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

[英]Session rollback, backout and dead-letter handler

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

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

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

上面称为“中毒消息”处理。

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

退出队列中的消息没有像DLQ这样的DLQ 您需要调查为什么消息在那里结束。 解决原因,然后将消息移回原始队列,以便可以将消息传递到应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM