Spring RetryTemplate
大约 3 分钟
使用spring的retry框架用两种方式,一种注解方式,一种代码方式,这里主要介绍代码编程方式。
初始化RetryTemplate主要有两个参数:
- RetryPolicy 主要定义什么情况要进行重试以及重试次数,比如超时、满足某个表达式。
- BackoffPolicy 主要定义两次重试之间的等待时间。backoff这个单词在计算机系统中有很多地方都有,代表的意思基本相同,基本都是重试直接的等待时间。它的基本思想是在遇到错误时,不是立即重试,而是等待一段时间后再尝试。这种等待的时间通常是逐渐增加的,这就是所谓的“退避”
RetryPolicy
- SimpleRetryPolicy 默认最多重试3次
- TimeoutRetryPolicy 默认在1秒内失败都会重试
- ExpressionRetryPolicy 符合表达式就会重试
- CircuitBreakerRetryPolicy 增加了熔断的机制,如果不在熔断状态,则允许重试
- CompositeRetryPolicy 可以组合多个重试策略
- NeverRetryPolicy 不重试
- AlwaysRetryPolicy 一直重试
BackoffPolicy
- FixedBackOffPolicy 默认固定延迟1秒后执行下一次重试
- ExponentialBackOffPolicy 指数递增延迟执行重试,默认初始0.1秒,系数是2,那么下次延迟0.2秒,再下次就是延迟0.4秒,如此类推,最大30秒。
- ExponentialRandomBackOffPolicy 在上面那个策略上增加随机性
- UniformRandomBackOffPolicy 这个跟上面的区别就是,上面的延迟会不停递增,这个只会在固定的区间随机
- StatelessBackOffPolicy 这个说明是无状态的,所谓无状态就是对上次的退避无感知,从它下面的子类也能看出来
个人比较喜欢实用 ExponentialBackOffPolicy
示例
private static final RetryTemplate RETRY_TEMPLATE;
static {
//重试时间间隔,分别是300ms,600ms,1200ms,依次翻倍,一直到最大时间间隔为3000ms
ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
backOffPolicy.setInitialInterval(300);
backOffPolicy.setMaxInterval(3000);
RETRY_TEMPLATE = RetryTemplate.builder()
//当抛这些异常的时候进行重试
.retryOn(Arrays.asList(RemoteAccessException.class, TimeoutException.class, NullPointerException.class))
//最大重试次数为4
.maxAttempts(4)
//自定义重试时间间隔
.customBackoff(backOffPolicy)
.build();
}
public Object httpRemoteCall(Object... params) {
AtomicInteger retryCounter = new AtomicInteger(1);
return RETRY_TEMPLATE.execute(ctx -> {
log.info("第" + retryCounter.getAndIncrement() + "次执行远程调用");
//在这里正常写远程调用的代码
//正常返回远程调用的结果
return new Object();
});
}
扩展
https://github.com/spring-projects/spring-retry
系统推荐
- 记一次内存泄漏
- RSA 加密解密多语言实现方案
- Notion笔记定时备份
- MySQL常用命令
- 常用队列
- 行转列不再复杂:SQL高手都在用的技巧揭秘
- AQS源码解读
- ShadowsockServer配置
- JetBrains-License-Server
- 前端axios下载csv文件乱码
- Hbase 总览
- 随机图片在线接口
- 随机毒鸡汤:当你准备好一切时,命运也在准备,给你换个难度。