在不丢失传入消息的情况下关闭Camel JMS使用者



我们有使用Camel从MQ(JmsComponent(到消费者的OpenShift Pods当我们重新部署时,Pod被关闭,新的Pod被重新部署,至少有一个Pod总是消耗到队列中。

我们看到Camel正在优雅地关闭:

o.a.camel.impl.DefaultShutdownStrategy: Starting to graceful shutdown 17 routes (timeout 300 seconds) 

但是,如果队列上有传入消息,我们有时会收到以下错误:

DefaultJmsMessageListenerContainer: Rejecting received message because of the listener container having been stopped in the meantime:
  1. 从Camel文档中,我们可能需要设置acceptMessagesWhileStopping=true。这是正确的吗?有什么缺点吗
  2. 我们是否需要实施先挂起路由的关闭策略

如果您真的丢失消息(来自问题主题(,那么您必须消耗事务处理的。这是唯一的消息丢失解决方案

当您不进行交易消费时,代理发送给消费者的每一条消息都是从代理的角度完成的。因此,如果消费者因为任何原因失去了它,它就失去了。

当您使用事务处理时,代理会保留消息,直到消费者提交事务为止。如果事务未提交,代理将再次发送消息(重新交付(。如果配置的重新传递次数失败,代理会将消息移动到DLQ。

因此,在pod关闭和娱乐的情况下,交易消费非常重要

想象一下这样的情况:一些消息被发送到pod,但pod由于重新部署而被删除。没有事务,消息就完成了,因为pod已经消耗了它。它无法完成消息的处理并不重要。

相反,对于事务,一些消息被发送到pod,pod关闭,但代理尚未收到消息的提交然后,代理将消息发送给另一个消费者(pod(

因此,在您的部署场景中,可能会发生(向Murphy问好(消息多次失败的情况,因为它们被多次传递到pod,而这些pod稍后由于重新部署而被删除。然而,它们从未丢失。在最坏的情况下,它们被放在DLQ中。

当JMS使用者是Camel路由时,通常在成功处理路由时提交事务(这取决于所使用的组件(。

则设置acceptMessagesWhileStopping仅为"化妆品"。因为如果在启动关闭时立即拒绝传入消息,那么可能会堆积大量DLQ消息。设置acceptMessagesWhileStopping=true可以减少这种情况。

最新更新