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

Man*_*glu 6 transactions message-queue high-volume ibm-mq

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

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

如果我尝试从队列中拉出一条消息,我会收到相同的消息,我回滚了吗?

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

感谢任何输入.

谢谢,Manglu

Che*_*eso 7

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

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

这些读者和编写者将把项目插入到队列中,或者在事务中解析队列中的项目.在这种情况下,其他队列项可能会出现或消失(或两者).

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


小智 6

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

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

发生这种情况的一个典型示例是 sc“有毒消息”:由于基本和非暂时性问题(例如无效格式、缺少字段等)而无法处理的消息。

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

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

华泰

盖伊


T.R*_*Rob 5

要回答该线程中的几个具体要点......

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