我收到来自 WebSPhere MQ 队列的消息。我尝试处理,如果我收到一些异常,我想将消息回滚到 MQ 队列。
我做同样的事情没有问题。消息会发生什么?它会排到队列的底部吗?
如果我尝试从队列中提取消息,我会收到与回滚相同的消息吗?
可能的行为是什么?我想知道这种行为通常在大容量队列场景中吗?
感谢任何输入。
谢谢,芒卢
我收到来自 WebSPhere MQ 队列的消息。我尝试处理,如果我收到一些异常,我想将消息回滚到 MQ 队列。
我做同样的事情没有问题。消息会发生什么?它会排到队列的底部吗?
如果我尝试从队列中提取消息,我会收到与回滚相同的消息吗?
可能的行为是什么?我想知道这种行为通常在大容量队列场景中吗?
感谢任何输入。
谢谢,芒卢
如果您在事务范围内执行队列操作,并且发生回滚,则在事务解决后,队列和消息将像事务开始前一样出现。换句话说,根本没有变化。
但是,在大容量场景中,通常在单个队列上有多个事务读取器和写入器,并且它们不会为每个出队或入队锁定整个队列。
这些读取器和写入器会将项目插入队列,或者在您注定的事务正在解决时以事务方式从队列中取出项目。在这种情况下,其他队列项目可能会出现或消失(或两者兼而有之)。
如果在原始事务回滚后,您再次从队列中出列,您可能会收到原始消息,但可能不会。在大容量、高并发的场景中,有可能在您的代码执行此操作之前,另一个阅读器已经提取了消息。
回滚将消息留在队列中并将其放置以重新传递。
但是,当达到重新传递尝试的(可配置的)限制时,消息将被放在“死信队列”中。
发生这种情况的典型示例是 sc '毒消息':由于基本和非暂时性问题(例如无效格式、缺少字段等)而无法处理的消息。
因此,在回滚(并将消息放回队列)之前,请务必考虑错误是否是暂时的(例如与后端的连接被破坏)。
在后一种情况下,最好吞下消息并记录错误或触发其他警报。否则,消息将不必要地消耗处理能力和队列基础设施。
高温高压
盖伊
要回答这个线程中的几个具体点......