我从WebSPhere MQ队列收到一条消息。我尝试处理,如果我收到一些异常,我想将消息回滚到MQ队列。
我也没有遇到任何问题。消息会怎么样?它是否排在队列的底部?
如果我尝试从队列中提取消息,我会收到相同的消息吗?
可能是什么行为?我想通常在高容量队列场景中知道这种行为吗?
感谢任何输入。
谢谢, Manglu
答案 0 :(得分:7)
如果您正在事务范围内执行队列操作,并且发生回滚,那么在事务解析队列之后,消息将像事务开始之前一样出现。换句话说,根本没有变化。
但是,在高容量方案中,通常在单个队列上有多个事务读取器和写入器,并且它们不会为每个队列锁定整个队列或排队。
这些读者和编写者会将项目插入队列,或者在您的注定事务正在解决时,以事务方式从队列中将项目从队列中取出。在这种情况下,其他队列项可能会出现或消失(或两者)。
如果在回滚原始事务后再次从队列中出队,则可能获取原始邮件,但您可能不会。在高容量,高并发的情况下,其他读者可能会在您的代码执行之前撤消该消息。
答案 1 :(得分:4)
回滚将消息留在队列中并将其放入以进行重新传递。
但是,当达到(可配置的)重新传递尝试限制时,该消息将被放在“死信队列”上。
发生这种情况的典型例子是s.c. '有害消息':由于基本和非瞬态问题(例如格式无效,缺少字段等)而无法处理的消息。
因此,在您回滚之前(并将消息放回队列中),请确保考虑错误是否是暂时的(例如,后端的连接是否被破坏)。
在后一种情况下,最好是吞下邮件并记录错误或触发其他警报。否则,该消息将不必要地消耗处理能力和队列基础结构。
HTH
盖
答案 2 :(得分:4)
回答这个帖子的几个具体要点......