关闭骆驼JMS使用者,而不会丢失传入消息

我们有使用Camel的OpenShift pod,用于MQ(JmsComponent)的消费者 当我们重新部署时,pod将被关闭,而新的pod将被重新部署,至少有一个pod始终会消耗到队列中。

我们看到骆驼正常关机:

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. the Camel Docs看来,我们可能需要设置 acceptMessagesWhileStopping = true 。那是对的吗?有什么缺点吗?
  2. 我们是否需要实施先暂停路由的关机策略?
mjg1mlf2 回答:关闭骆驼JMS使用者,而不会丢失传入消息

如果您确实丢失了邮件(来自问题的主题),则您必须consume transacted 。这是消息丢失的唯一解决方案。

当您不使用交易时,经纪人发送给消费者的每条消息都是从经纪人的角度完成的。因此,如果消费者由于任何原因而丢失了它,那么它就会丢失。

当您消费交易时,代理保留消息,直到消费者提交交易。如果未提交交易,则经纪人再次发送消息(重新发送)。如果配置的重新发送次数失败,则代理将消息移至DLQ

因此,在您关闭和重新启动广告连播的情况下,消费交易非常重要!

想象一下这样的情况:一些邮件发送到了一个窗格,但是由于重新部署而删除了该窗格。如果没有事务,则消息完成,因为容器已将其消耗掉。它无法完成对消息的处理并不重要。

相反,具有交易,一些消息被发送到Pod,Pod掉了,但是经纪人尚未收到对消息的提交。 然后,代理将邮件发送给另一个使用者(pod)

因此,在您的部署方案中,可能会发生消息多次失败(向墨菲打个招呼),因为消息多次传递到了Pod,但由于重新部署而被删除了。但是,它们永远不会丢失。最坏的情况是将它们放在DLQ中。

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

设置acceptMessagesWhileStopping只是“化妆品”。因为如果在启动关闭时立即拒绝传入消息,则许多DLQ消息会堆积。设置acceptMessagesWhileStopping=true可以减少这种情况。

本文链接:https://www.f2er.com/3106916.html

大家都在问