首页 文章

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

提问于
浏览
2

我正在使用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 回答

  • 4

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

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

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

    一旦消息的重新传递尝试超过为重新传递策略配置的maximumRedeliveries,就会将“Poison ack”发送回经纪人,让他知道该消息被视为毒丸 . 然后,代理接收消息并将其发送到死信队列,以便稍后进行分析 .

    您需要调整RedeliveryPolicy,因为只要未超过maximumRedeliveries,邮件就会处于暂挂状态 .

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

相关问题