如果消息在MQ中回滚会发生什么?

时间:2009-05-26 13:16:02

标签: transactions message-queue ibm-mq high-volume

我从WebSPhere MQ队列收到一条消息。我尝试处理,如果我收到一些异常,我想将消息回滚到MQ队列。

我也没有遇到任何问题。消息会怎么样?它是否排在队列的底部?

如果我尝试从队列中提取消息,我会收到相同的消息吗?

可能是什么行为?我想通常在高容量队列场景中知道这种行为吗?

感谢任何输入。

谢谢, Manglu

3 个答案:

答案 0 :(得分:7)

如果您正在事务范围内执行队列操作,并且发生回滚,那么在事务解析队列之后,消息将像事务开始之前一样出现。换句话说,根本没有变化。

但是,在高容量方案中,通常在单个队列上有多个事务读取器和写入器,并且它们不会为每个队列锁定整个队列或排队。

这些读者和编写者会将项目插入队列,或者在您的注定事务正在解决时,以事务方式从队列中将项目从队列中取出。在这种情况下,其他队列项可能会出现或消失(或两者)。

如果在回滚原始事务后再次从队列中出队,则可能获取原始邮件,但您可能不会。在高容量,高并发的情况下,其他读者可能会在您的代码执行之前撤消该消息。

答案 1 :(得分:4)

回滚将消息留在队列中并将其放入以进行重新传递。

但是,当达到(可配置的)重新传递尝试限制时,该消息将被放在“死信队列”上。

发生这种情况的典型例子是s.c. '有害消息':由于基本和非瞬态问题(例如格式无效,缺少字段等)而无法处理的消息。

因此,在您回滚之前(并将消息放回队列中),请确保考虑错误是否是暂时的(例如,后端的连接是否被破坏)。

在后一种情况下,最好是吞下邮件并记录错误或触发其他警报。否则,该消息将不必要地消耗处理能力和队列基础结构。

HTH

答案 2 :(得分:4)

回答这个帖子的几个具体要点......

  • 消息保留在队列中的位置。同步点下的GET会锁定消息,但不会将其从队列中删除或更改其位置。回滚释放锁定并使消息可用于重新传递。
  • 使用JMS和XMS类自动重新排列有害消息,而不是本机Java,C,C#,COBOL等API。如果您没有使用JMS或XMS(为C和.Net程序实现JMS API),那么您需要自己重新排队。
  • 您是正确的,在超过BOQTHRESH重新传递后,将在输入队列的BOQNAME属性中命名的队列上尝试重新排队。如果该队列不可用(完整,未授权,不存在等),则尝试DLQ。如果失败,则消息侦听器将完全停止接收消息。
  • 理想情况下,程序将通过重新排列它并在异常队列中警告消息的存在来处理有害消息。如果做不到这一点,至少不要只是消费和丢弃消息。记录它以及消息标题,以便以后有人可以协调它发生的事情。