如何保证重试时消息不会丢失?

问题描述 投票:0回答:2

我正在尝试在 Camel 中保留重新投递的消息:

from("activemq:incoming-queue")
     .errorHandler(
         deadLetterChannel("activemq:queue.dead-letter")
         .maximumRedeliveries(100)
         .redeliveryDelay(TimeUnit.SECONDS.toMillis(10))
     )
.to("http4://example.com")

如果发生故障,会安排重试,如果我关闭 Camel,它会将消息放回到 ActiveMQ 队列中,这很好。如果你用“kill -9”杀死它,消息将永远丢失,因为 Camel 在重试期间将它们保存在内存中。

如何保证即使系统突然宕机,重试消息也不会丢失?

spring-boot apache-camel activemq-classic
2个回答
3
投票

为了让克劳斯的回答更具体:

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${activemq.url}"/>
    <property name="userName" value="${activemq.userName}"/>
    <property name="password" value="${activemq.password}"/>
    <property name="redeliveryPolicy">
        <bean class="org.apache.activemq.RedeliveryPolicy">
            <property name="maximumRedeliveries" value="100"/>
            <property name="initialRedeliveryDelay" value="10000"/>
            <property name="redeliveryDelay" value="10000"/>
        </bean>
    </property>
</bean>

使用 ActiveMQ 重试 100 次,第一次重试等待 10 秒,随后每次重试等待 10 秒。

然后你可以省略 Camel 中的错误处理(从而将其留给 ActiveMQ),但我会添加事务:

from("activemq:incoming-queue")
     .transacted("PROPAGATION_REQUIRED_JMS")
     .to("http4://example.com")

重试 100 次后,消息将最终出现在队列“ActiveMQ.DLQ”中,除非您进行更改。


2
投票

最好在ActiveMQ代理端配置这种持久重新交付,你可以这样做,因为它具有这样的功能。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.