我正在尝试在 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 在重试期间将它们保存在内存中。
如何保证即使系统突然宕机,重试消息也不会丢失?
为了让克劳斯的回答更具体:
<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”中,除非您进行更改。
最好在ActiveMQ代理端配置这种持久重新交付,你可以这样做,因为它具有这样的功能。