2012-12-21 32 views
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(); 
} 

回答

3

消息可以通过MQ JMS提供者退出了一回出队列或几个原因死信队列。其中有些是

1)格式错误的消息
2)消息不是由客户端应用程序或者通过在做一个事务会话在客户端的CommitMessage.Acknowledge()承认确认会话。在这种情况下,消息被重新发送。如果一次又一次地传递相同内容,则MQ JMS提供程序会根据队列上的BOTHRESH设置移动该消息以退出队列。

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

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

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