ActiveMQ与再交付

ActiveMQ与再交付,activemq,Activemq,我有一个关于重新传递消息的问题 设置如下所示: 两个AMQ实例AMQ1和AMQ2(版本5.10.0)以主/从配置(其中AMQ1为主)运行,两个使用者a和B从同一队列Q获取。客户端配置为使用ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE,它们处于循环获取(拉模式)消息中,而不确认任何消息 测试用例: 向队列Q发送持久消息 该消息被一个用户使用 正在停止AMQ1,这将导致AMQ2出现 现在,有两件事发生了: a) 消费者a再次收到消息,导致消息被放入死信队列。 b) 消

我有一个关于重新传递消息的问题

设置如下所示:

两个AMQ实例AMQ1和AMQ2(版本5.10.0)以主/从配置(其中AMQ1为主)运行,两个使用者a和B从同一队列Q获取。客户端配置为使用ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE,它们处于循环获取(拉模式)消息中,而不确认任何消息

测试用例:

  • 向队列Q发送持久消息
  • 该消息被一个用户使用
  • 正在停止AMQ1,这将导致AMQ2出现
  • 现在,有两件事发生了:

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

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

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


    谢谢

    我认为没有办法将ActiveMQ配置为在客户端重新连接时重新发送消息,因为客户端已重新启动,但在代理重新启动或故障转移时则没有。您最好的选择可能是在您的客户机中为您已处理但未确认的任何消息保留JMSMessageID,这样您就可以在重复消息第二次到达时忽略它们,这将在一个简单的示例中解决问题


    您可以使用来确保消息始终发送给同一消费者(防止场景B),但我自己从未使用过它们,因此我不确定它们是否会在故障切换场景中应用于两个代理。但是,如果您认为这可能会有所帮助,那么这将是一个简单的测试。

    您等待确认您的邮件有什么原因吗?如果您没有告诉代理您已经处理了消息,那么当消息返回时,它将尝试重新传递消息。我很惊讶您看到的是行为a),但b)对于您所描述的内容是非常期望的。@Tim我正在处理需要几分钟才能完成的消息。我最终会确认该消息,但在此处理过程中重新启动AMQ将导致我的问题中描述的测试用例。好的,从您的描述来看,您的消费者似乎会在不确认第一条消息的情况下拉第二条(以及第三条、第四条等)消息。谢谢你的澄清。