Activemq 代理重新启动时处理器中的消息丢失

Activemq 代理重新启动时处理器中的消息丢失,activemq,processor,Activemq,Processor,在我的工作中,我一直在寻找一种并行处理传入消息的解决方案。经过多次尝试和错误,我想我可能有一个可行的解决方案 然而,我正在研究的平台的一个要求是,需要重新启动正在处理的消息,或者在代理突然重新启动时重新排队 在测试过程中,我成功地一次启动了多个处理器,以对每条消息执行一个工作单元。我在突然重新启动代理时发现,在处理器内处理的任何消息实际上都丢失了。但是,当处理器抛出故意异常时,消息将重新传递到队列 在邮件正在处理且工作单元尚未完成时,如何保护邮件? 任何建议都将不胜感激 注意:最终的实现将使用t

在我的工作中,我一直在寻找一种并行处理传入消息的解决方案。经过多次尝试和错误,我想我可能有一个可行的解决方案

然而,我正在研究的平台的一个要求是,需要重新启动正在处理的消息,或者在代理突然重新启动时重新排队

在测试过程中,我成功地一次启动了多个处理器,以对每条消息执行一个工作单元。我在突然重新启动代理时发现,在处理器内处理的任何消息实际上都丢失了。但是,当处理器抛出故意异常时,消息将重新传递到队列

在邮件正在处理且工作单元尚未完成时,如何保护邮件? 任何建议都将不胜感激


注意:最终的实现将使用tcp负载平衡器后面两个相同代理的主设置。

为了保留消息,您必须将事务与持久消息一起使用。如果没有事务处理会话,则不会涵盖所有异常情况,特别是如果您使用默认的自动确认,它会告诉代理您已使用该消息,因此在消息传递后立即删除该消息。这就是为什么重新启动代理时会丢失消息。这是没有别的办法的


假设事务设置正确,则没有理由不能并行处理,但是仍然充满了好的信息,以确保您正确设置了事务

您正在使用事务吗?问题中的消息是否持久?这些消息将以DeliveryMode.persistent发布到队列中。不确定如何将事务添加到处理器。目前,如果我关闭activemq的java进程,所有正在运行的消息都会消失。我只是在每个路由中添加了事务,但是消息不再以并行方式处理……不幸的是,这并没有像预期的那样起作用,特别是在使用AsyncProcessor接口并行处理时。从中我了解到,设置asyncConsumer=true会在设置Transact=true后被忽略。我可能会在Camel 3.0中获得对异步事务的支持:这是另一个问题。在回答您这里的问题时,确保在代理删除消息之前完全处理消息的唯一选项是使用事务。您不能使用CLIENT_ACKNOWLEDGE确保至少一次传递所有消息吗?在代理重新启动时,您将获得重新交付,而不是不交付,但如果消费者能够处理,您将避免丢失消息…可能的情况已经改变,但给人的印象是,这不会在整个路由中保护消息,即如果路由不正常,我理解,它可以防止未交付,允许重新交付。因此,如果路由中断,而您尚未确认该消息,但已对其进行了处理,则您可能会再次收到该消息,您必须接受该风险。但我已经多年没有处理过确认选项了,所以我可能对它的工作原理有误解。