ActiveMQ中的setBackOffMultiplier(double backOffMultiplier)如何工作

时间:2016-10-28 03:49:22

标签: java jms activemq jms-topic activemq-artemis

我正在使用activemq编写应用程序,我正在使用重新传递策略重新传递消息。我正在使用ActiveMQ的ExponentialBackOff概念。

我的问题是这个ExponentialBackOff / setBackOffMultiplier是如何工作的。

例如在我的情况下,我想重新发送消息,直到消息到期时间为15分钟。我想尝试在15分钟内重新发送10次。但ExponentialBackOff使消息重新启动超过15分钟到期时间消息,即即使在15分钟的到期时间之后,要重新传递的消息仍处于暂挂状态。

这是为什么?我对这种行为感到困惑。我使用的重新发送政策如下。

RedeliveryPolicy queuePolicy = new RedeliveryPolicy();
queuePolicy.setInitialRedeliveryDelay(0);
queuePolicy.setBackOffMultiplier(3);
queuePolicy.setUseExponentialBackOff(true);
queuePolicy.setMaximumRedeliveries(10);

1 个答案:

答案 0 :(得分:4)

使用此RedeliveryPolicy配置,RedeliveryPolicy将在每次等待以下后进行尝试:

after 1s
after 3s
9s
27s
81s
243s
729s
2187s
6561s
19683s

如您所见,此尝试在数小时后执行,同时您会看到消息状态正在等待处理。 要防止这些长时间,您可能需要设置maximumRedeliveryDelay=300000L (5分钟)。 注意

  

一旦消息的重新传递尝试超过了为重新传递策略配置的最大重新传递,就会出现一个" Poison ack"被送回经纪人,让他知道这条消息被认为是毒丸。然后,代理接收消息并将其发送到死信队列,以便稍后进行分析。

您需要调整RedeliveryPolicy,因为只要不超过maximumRedeliveries,邮件就会处于待处理状态。

http://activemq.apache.org/message-redelivery-and-dlq-handling.html