我们经常会遇到一些场景,需要重试当前的操作,比如:文件上传失败,重新上传;微信accesstoken获取失败,重新获取等等的场景问题。那么今天就说一种可以实现此种机制的工具包:spring-retry。
如图,可以看到spring-retry最新版本是1.2.2.RELEASE, 该工具把重试操作模板定制化,可以设置重试策略和回退策略。同时重试执行实例保证线程安全。
要是用它,先引入架包:
org.springframework.retry
spring-retry
1.2.2.RELEASE
具体的代码实现:
// 构建重试模板实例
RetryTemplate retry=new RetryTemplate();
//设置重试策略,主要设置重试次数
SimpleRetryPolicy srp = new SimpleRetryPolicy();
srp.setMaxAttempts(3);// 重试3次
//设置重试回退操作策略,主要设置重试间隔时间
FixedBackOffPolicy fbop = new FixedBackOffPolicy();
fbop.setBackOffPeriod(2000);//重试间隔2s,单位ms
retry.setRetryPolicy(srp);
retry.setBackOffPolicy(fbop);
//重试器,重试成功后返回 true
final RetryCallback dmReCall=new RetryCallback(){
@Override
public Object doWithRetry(RetryContext context) throws Exception {// 开始重试
//这里填写要重试的逻辑代码
System.out.println("do some thing");
//规定在哪种状态下,发生异常,才会进行重试
if(true){
throw new RuntimeException();//这里需要注意,重试的根源是抛出异常
}
return null; //成功之后返回的数据,可以是任意数据类型
}
};
//重试失败后,执行-
final RecoveryCallback rvcb=new RecoveryCallback(){
@Override
public Object recover(RetryContext context) throws Exception { // 重试多次后都失败了
//这里可以添加最后失败的代码逻辑
logger.info("------- RecoveryCallback --------");
return false; //重试后失败返回的数据,可以是任意数据类型
}
};
//删除菜单重试机制开始
try {
Object obj = retry.execute(dmReCall,rvcb);
//这里可以根据obj的数据进行判断,重试最终成功了,还是失败了。
System.out.println("do some obj");
} catch (Exception e) {
//error
}
RetryTemplate 承担了重试执行者的角色,它可以设置SimpleRetryPolicy(重试策略,设置重试上限,重试的根源实体),FixedBackOffPolicy(固定的回退策略,设置执行重试回退的时间间隔)。 RetryTemplate通过execute提交执行操作,需要准备RetryCallback 和RecoveryCallback 两个类实例,前者对应的就是重试回调逻辑实例,包装正常的功能操作,RecoveryCallback实现的是整个执行操作结束的恢复操作实例。同时RetryTemplate的execute 是线程安全的。
有重试机制需要的,可以尝试下这个工具。