听起来像一个经典的未处理的毒药消息问题。当应用程序读取无法处理的消息时,该消息将退回到队列中。然后再次读回,因为它位于队列的顶部。这导致消息出现在同步点下,直到最后听者放弃并停止。
有时问题出现在应用程序中,而应用程序是明确调用的 ROLLBACK 。有时虽然回滚发生,但应用程序甚至会看到消息。例如,如果消息无法转换为本地代码页,或其他低级错误。
ROLLBACK
如果这是正在发生的事情,答案是定义一个退出队列,然后改变输入队列以指向它。例如,如果调用输入队列 SRC.RECEIVER.QUEUE 你可以在QMgr上做这样的事情 runmqsc :
SRC.RECEIVER.QUEUE
runmqsc
DEFINE QL(SRC.RECEIVER.QUEUE.BKOUT) ALTER QL(SRC.RECEIVER.QUEUE) BOQNAME(SRC.RECEIVER.QUEUE.BKOUT) BOTHRESH(15)
如果问题确实是有害消息,则问题消息将作为未提交的消息显示在回退队列中。一旦应用程序发出下一个 COMMIT 对于源队列,回退消息将在回退队列中可见。如果源队列上没有其他消息到达,则有害消息将在退出队列中保持未提交状态,或者可能还原为源队列 ROLLBACK 由app或QMgr调用。
COMMIT
退出队列的设置很简单,应该是标准做法,所以无论是否能解决问题,我都建议你这样做。请参阅 在JMS的WebSphere MQ类中处理有害消息 在信息中心。