6

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

我做同样的事情没有问题。消息会发生什么?它会排到队列的底部吗?

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

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

感谢任何输入。

谢谢,芒卢

4

3 回答 3

7

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

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

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

如果在原始事务回滚后,您再次从队列中出列,您可能会收到原始消息,但可能不会。在大容量、高并发的场景中,有可能在您的代码执行此操作之前,另一个阅读器已经提取了消息。

于 2009-05-26T15:38:40.110 回答
5

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

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

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

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

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

高温高压

盖伊

于 2009-06-02T20:17:57.613 回答
4

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

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