代码之家  ›  专栏  ›  技术社区  ›  Manglu

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

  •  5
  • Manglu  · 技术社区  · 15 年前

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

    我做同样的事没有问题。信息怎么了?它会排到队伍的最后吗?

    如果我尝试从队列中提取消息,我是否会收到与回滚相同的消息?

    可能的行为是什么?我想知道这种行为在高容量队列场景中的典型情况?

    感谢任何意见。

    谢谢, 曼格鲁

    3 回复  |  直到 14 年前
        1
  •  7
  •   Cheeso    15 年前

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

    不过,在高容量场景中,通常在单个队列上有多个事务读写器,并且它们不会为每个解队列或排队锁定整个队列。

    这些读取器和写入器将在解析注定失败的事务时,以事务方式将项插入队列或从队列中出列项。在这种情况下,其他队列项可能出现或消失(或同时出现或消失)。

    如果在原始事务回滚之后,再次从队列中出列,则 可以 得到原始信息,但你不能。在高容量、高并发性的场景中,可能是另一个读者在您的代码执行此操作之前已经提取了消息。

        2
  •  4
  •   Marc Gravell    15 年前

    Rollback将消息留在队列中,并将其放置以供重新传递。

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

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

    因此,在回滚(并将消息放回队列)之前,请确保考虑错误是否是暂时性的(比如到后端的连接断开)。

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

    高温高压

    家伙

        3
  •  4
  •   T.Rob    14 年前

    要回答这个主题中的几个具体问题。。。

    • 消息保留它在队列中的位置。GET under syncpoint锁定消息,但不会将其从队列中移除或更改其位置。Rollback释放锁并使消息可用于重新传递。
    • 毒药消息的自动重新排队发生在JMS和XMS类中,而不是本地Java、C、C#、COBOL等api中。如果您没有使用JMS或XMS(它为C和.Net程序实现JMS API),那么您需要自己重新排队消息。
    • 在超过BOQTHRESH重新传递之后,将在输入队列的BOQNAME属性中命名的队列上尝试重新排队,这是正确的。如果该队列不可用(完全、未授权、不存在等),则尝试DLQ。如果失败,消息侦听器将完全停止接收消息。
    • 理想情况下,程序将通过重新排队并在异常队列中出现消息时发出警报来处理有害消息。如果做不到这一点,至少不要只是消耗和丢弃信息。把它和消息头一起记录下来,这样以后有人就可以协调它发生的事情了。
    推荐文章