RetryTemplate
提供给外部调用的重试执行器
class RetryTemplate{
BackOffPolicy backOffPolicy
RetryPolicy retryPolicy
public final <T, E extends Throwable> T execute(RetryCallback<T, E> retryCallback,
RecoveryCallback<T> recoveryCallback) throws E {
return doExecute(retryCallback, recoveryCallback, null);
}
}
执行流程:
- 使用重试策略(RetryPolicy)创建重试上下文,org.springframework.retry.RetryPolicy#open(RetryContext parent)
- 使用退避策略(BackOffPolicy)创建退避上下文,org.springframework.retry.backoff.BackOffPolicy#start(RetryContext context)
- 执行org.springframework.retry.RetryPolicy#canRetry判断是否应该重试,并且重试上下文的强制结束标志(org.springframework.retry.RetryContext#isExhaustedOnly)为false,如果不应该重试,执行兜底方案org.springframework.retry.RecoveryCallback#recover
- 执行重试逻辑,也就是业务逻辑,org.springframework.retry.RetryCallback#doWithRetry
- 如果抛异常了,先执行org.springframework.retry.RetryPolicy#registerThrowable,再执行退避策略org.springframework.retry.backoff.BackOffPolicy#backOff,跳到第3步
- RetryPolicy:重试策略,用来控制是否应该重试,比如抛出了指定异常或达到最大重试次数时停止重试
- BackOffPolicy:退避策略,用来控制重试的时间间隔,比如按照指数增长的间隔和最大时间间隔来重试
- RetryCallback:重试的具体逻辑
- RecoveryCallback:重试策略判断不再继续重试时的兜底逻辑,比如返回一个错误信息
RetryTemplate retryTemplate = new RetryTemplate();
//指数退避策略
ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
backOffPolicy.setInitialInterval(3000);
backOffPolicy.setMultiplier(2);
backOffPolicy.setMaxInterval(15000);
retryTemplate.setBackOffPolicy(backOffPolicy);
CircuitBreakerRetryPolicy retryPolicy = new CircuitBreakerRetryPolicy();
retryPolicy.setOpenTimeout(3000);
retryPolicy.setResetTimeout(6000);
retryTemplate.setRetryPolicy(retryPolicy);
String result = retryTemplate.execute(context -> {
int i = new Random().nextInt(10);
if (i < 7) {
throw new RuntimeException("fail");
}
return "success" + i;
}, context -> {
return "兜底";
});
System.out.println(result);