【问题标题】:What happens with ActiveMQ unacknowledged messagesActiveMQ 未确认消息会发生什么
【发布时间】:2020-02-20 18:45:26
【问题描述】:

如果在 ActiveMQ 中创建了一个队列,该队列具有一个生产者(这是客户端确认模式)和一个侦听器,在成功处理消息后,其 onMessage 方法仅被确认。说如果有异常并且消息仍未确认并因此保留在队列中。它会再次发送给消费者吗?或者这些消息会发生什么?

【问题讨论】:

  • 你用的是什么客户端?

标签: jms activemq consumer


【解决方案1】:

所有未确认的消息都保留在队列中。

会再次发送给消费者吗?

是的,它将再次发送给消费者。

我不确定 Active MQ 是否有一个 queue 属性,当设置该属性时,它会一次又一次地停止向消费者传递相同的消息,而是将其移动到一个名为 backout queue 或 dead letter queue 的队列中。 IBM MQ 在队列上有一个属性,BOTHRESH - 回退阈值 - 每次将消息传递给消费者时,传递计数(或回退计数)都会增加。再次投递消息时,IBM MQ 会检查消息的回退计数是否大于BOTHRESH 计数。如果是这样,如果设置了消息,则消息将移至回退队列或死信队列。

【讨论】:

  • 以及如何访问此类消息?在 IBM MQ 中?现在我将检查 activemq,因为我知道它会再次交付。我很好奇在 IBM MQ 中访问发送到备份队列的消息
  • Backout Queue 只是另一个队列,从该队列访问消息也与其他队列相同。
【解决方案2】:

当消息由于某些异常而没有被消费者处理时,最好发送否定确认。例如带有 STOMP 协议的 NACK。然后该消息保留在队列中。 ActiveMQ 可以配置为在接收到来自消费者的 NACK 时进行重新传递尝试。

https://stomp.github.io/stomp-specification-1.2.html#NACK

【讨论】:

  • 我使用过 session.recover()。即便如此,消息仍处于待处理状态,并且会在其他消息之前先发送。
  • 这个答案也对。但是,就我而言,我没有使用 stomp。
  • 一般来说,当消息由于未确认而留在队列中时,它会像任何其他消息一样再次发送给消费者。在 ActiveMQ 中,默认情况下,在发送到 dlq 之前,会有大约 6 次向消费者重新发送的尝试。
猜你喜欢
  • 2012-05-10
  • 1970-01-01
  • 2015-09-07
  • 2013-08-01
  • 1970-01-01
  • 2013-05-30
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多