【发布时间】:2020-02-20 18:45:26
【问题描述】:
如果在 ActiveMQ 中创建了一个队列,该队列具有一个生产者(这是客户端确认模式)和一个侦听器,在成功处理消息后,其 onMessage 方法仅被确认。说如果有异常并且消息仍未确认并因此保留在队列中。它会再次发送给消费者吗?或者这些消息会发生什么?
【问题讨论】:
-
你用的是什么客户端?
如果在 ActiveMQ 中创建了一个队列,该队列具有一个生产者(这是客户端确认模式)和一个侦听器,在成功处理消息后,其 onMessage 方法仅被确认。说如果有异常并且消息仍未确认并因此保留在队列中。它会再次发送给消费者吗?或者这些消息会发生什么?
【问题讨论】:
所有未确认的消息都保留在队列中。
会再次发送给消费者吗?
是的,它将再次发送给消费者。
我不确定 Active MQ 是否有一个 queue 属性,当设置该属性时,它会一次又一次地停止向消费者传递相同的消息,而是将其移动到一个名为 backout queue 或 dead letter queue 的队列中。 IBM MQ 在队列上有一个属性,BOTHRESH - 回退阈值 - 每次将消息传递给消费者时,传递计数(或回退计数)都会增加。再次投递消息时,IBM MQ 会检查消息的回退计数是否大于BOTHRESH 计数。如果是这样,如果设置了消息,则消息将移至回退队列或死信队列。
【讨论】:
当消息由于某些异常而没有被消费者处理时,最好发送否定确认。例如带有 STOMP 协议的 NACK。然后该消息保留在队列中。 ActiveMQ 可以配置为在接收到来自消费者的 NACK 时进行重新传递尝试。
【讨论】: