无法更改 ActiveMQ 重新交付策略



我们使用由Java Windows服务包装器触发的ActiveMQ 5.14.2.1,使用JMS和Spring框架JMS(v4.3.28(从Tomcat Web应用程序进行访问。

我正在尝试配置一个重新传递策略,以便当我们使用session.rollback()将消息返回到队列时,它遵循该策略。为此,我在activemq.xml文件中设置了redeliveryPlugin,如下所示:

<amq:redeliveryPlugin fallbackToDeadLetter="true" sendToDlqIfMaxRetriesExceeded="true">
<amq:redeliveryPolicyMap>
<amq:redeliveryPolicyMap>
<amq:defaultEntry>
<amq:redeliveryPolicy maximumRedeliveries="20" useExponentialBackOff="true" 
initialRedeliveryDelay="1000" redeliveryDelay="2000" maximumRedeliveryDelay="600000"/>
</amq:defaultEntry>
</amq:redeliveryPolicyMap>
</amq:redeliveryPolicyMap>
</amq:redeliveryPlugin>

我还更新了broker元素以打开schedulerSupport:

<amq:broker brokerName="MyBroker" dataDirectory="${activemq.data}" 
useJmx="false" schedulerSupport="true">

我根据各种文档页面和一些SO结果尝试了一些排列,但没有成功。无论我尝试什么,它都使用默认的重新交付行为(间隔1秒,没有指数后退,最多6次重试(。我知道它正在读取这个activemq.xml文件,因为当我放入与XSD不匹配的内容时,它会出错。

我必须做些什么才能更改ActiveMQ的重新交付策略?

经过大量的调查和使用调试器在ActiveMQ中查找,我发现了发生了什么。事实证明,上面的配置基本正确。我稍微修改了一下:

<amq:redeliveryPolicy maximumRedeliveries="20" useExponentialBackOff="true" 
initialRedeliveryDelay="5000" backOffMultiplier="2" maximumRedeliveryDelay="600000"/>

令人困惑的是,客户端和服务器都在尝试重试,但它们似乎使用了不同的算法:

  • 客户端最初进行6次重试,间隔1秒
  • 如果这些都失败了,它会将消息发送回ActiveMQ
  • ActiveMQ执行重新交付行为,这意味着使用初始重新交付延迟(5秒(
  • 如果消息仍然失败,客户端会每隔1秒重试一次,但这次只进行5次尝试
  • ActiveMQ再次执行重新交付行为,将延迟增加一倍,达到10s
  • 重新传递后,客户端会再次重试,但这一次在将消息发送回ActiveMQ之前仅4

此周期持续进行,客户端每次将本地重试次数减少1次,ActiveMQ使用指数回退增加重试时间。最后,ActiveMQ以10分钟的间隔(最大延迟(发送消息,客户端在失败时进行0次本地重试。我想客户端的想法是尝试让代码在本地解决问题几次,但随着时间的推移,这种可能性越来越小。

最新更新