【问题标题】:ActiveMQ and redeliveryActiveMQ 和重新交付
【发布时间】:2014-12-15 07:34:35
【问题描述】:

我有一个关于重新发送邮件的问题。

设置如下:

在主/从配置中运行的两个 AMQ 实例 AMQ1 和 AMQ2(版本 5.10.0)(其中 AMQ1 为主),两个消费者 A 和 B 从同一个队列 Q 中获取。客户端配置为使用 ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE他们坐在一个循环中获取(拉模式)消息,没有确认任何消息。

测试用例:

  1. 向队列 Q 发送持久消息。
  2. 消息被 A 消费。
  3. 停止 AMQ1,从而启动 AMQ2。

现在,发生了两种情况之一:

a) 消费者 A 再次收到消息,导致消息被放入死信队列。 b) 消费者 B 收到消息,现在 A 和 B 都有相同的消息。

在 a) 中,我面临的问题是,如果 A 崩溃,消息就会丢失。在 b) 中,问题是现在两个消费者对同一条消息采取行动。

是否可以将 AMQ 配置为以某种方式跟踪重新连接的消费者,因此如果发现某个消费者已经存在消息,它就不会重新发送消息?至少在 a) 中应该有办法避免将消息放入 DLQ 中?

谢谢!

【问题讨论】:

  • 您是否有理由等待确认您的消息?如果您不告诉代理您已经处理了该消息,它会在消息恢复时尝试重新传递该消息。我很惊讶您看到的行为 a),但 b) 对于您所描述的内容是非常符合预期的。
  • @Tim 我正在处理需要几分钟才能完成的消息。我最终会确认该消息,但在此处理期间重新启动 AMQ 将导致我的问题中描述的测试用例。
  • 好的,从您的描述看来,您的消费者会在不确认第一个消息的情况下提取第二个(以及第三个、第四个等)消息。感谢您的澄清。

标签: activemq


【解决方案1】:

我不相信有一种方法可以配置 ActiveMQ 以在客户端重新连接时重新发送消息,因为客户端重新启动但如果代理重新启动或故障转移则不会。您最好的选择可能是将您已处理但未确认的任何消息的 JMSMessageID 保留在您的客户端中,因此您可以在它们第二次到达时忽略重复项,这将解决 A 中的问题。

您也许可以使用message groups 来确保消息始终发送给同一个消费者(防止场景 B),但我自己从未使用过它们,所以我不确定它们是否适用于两个代理在您的故障转移方案中。但是,如果您认为它可能会有所帮助,这对您来说将是一个简单的测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 2014-09-24
    • 2013-03-07
    • 2015-06-23
    • 2017-01-01
    • 2011-07-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多