如何以指数方式增加Spring RequestHandlerRetryAdvice中的重试间隔

时间:2016-05-10 19:52:38

标签: java spring spring-integration spring-retry

重试指定如下:

<bean id="retryAdvice"
    class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice" >
    <property name="retryTemplate">
            <bean class="org.springframework.retry.support.RetryTemplate">
            <property name="backOffPolicy">
                    <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy">
                    <property name="initialInterval" value="5000"/>
                    <property name="multiplier" value="3.0"/>
                    </bean>
            </property>
            <property name="retryPolicy">
                    <bean class="org.springframework.retry.policy.SimpleRetryPolicy">
                    <property name="maxAttempts" value="6" />
                    </bean>
            </property>
            </bean>
    </property>
</bean>

我预计每次尝试时间间隔都会增加3倍。实际上我得到了以下间隔: 5,15,30,30,30秒。请参阅下面的确切时间和间隔。 我错误地指定了什么?

2016-05-10 10:07:49,714 - 0
2016-05-10 10:07:55,085 - 5.2
2016-05-10 10:08:10,457 - 15.4
2016-05-10 10:08:40,830 - 30.4
2016-05-10 10:09:11,230 - 30.4
2016-05-10 10:09:41,639 - 30.4

2 个答案:

答案 0 :(得分:5)

需要考虑maxInterval

/**
 * Setter for maximum back off period. Default is 30000 (30 seconds). the
 * value will be reset to 1 if this method is called with a value less than
 * 1. Set this to avoid infinite waits if backing off a large number of
 * times (or if the multiplier is set too high).
 *
 * @param maxInterval in milliseconds.
 */
public void setMaxInterval(long maxInterval) {
    this.maxInterval = maxInterval > 0 ? maxInterval : 1;
}

因此,当您的ExponentialBackOffPolicy达到30 secs(默认)时,之后就会停止使用multiplier

答案 1 :(得分:1)

增加最大间隔以使乘数生效。

5.0 # float
5   # integer
5 / 2 = 2 # integer
5 / 2.0 = 2.5 #float