2009-05-26 91 views
5

我从WebSPhere MQ队列收到消息。我尝试处理,如果收到一些异常,我想将消息回滚到MQ队列。如果消息在MQ中回滚会发生什么情况?

我在做同样的事情上没有问题。信息会发生什么?它是否进入队列底部?

如果我尝试从队列中拉出消息,我会收到同样的消息,我回滚?

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

欣赏任何输入。

感谢, Manglu

回答

5

如果你在一个事务的范围内做队列操作,并发生回滚,事务解析队列和信息出现正如它的事务开始之前再经过。换句话说,根本没有改变。

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

这些读者和作者将在注定的事务解决时将事件插入队列中,或事务性地从队列中取出队列。在这种情况下,其他队列项目可能会出现或消失(或两者)。

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

3

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

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

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

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

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

HTH

盖伊

+0

马克, 我的理解是达到回来了门槛之后,mesage发送到背出队列,而不是死信队列。只有当消息不能写入BOQ时才发送给DLQ。 Manglu – Manglu 2009-06-23 03:33:26

3

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

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