优雅的系统重试
进入正题之前,先引入这样一个场景:
最近,程序员A接到这样一个业务需求:需要对接多个第三方接口且第三方接口可能会失败,需要发起重试,并且支持最大重试次数,成功后续重试次数不执行,超过重试次数进行状态检查,检查不通过需要抛出异常。
接到这个需求,A同学开动小脑筋,马上就想到了解决策略,说干就干,A同学的代码结构如下:
/**最大执行次数*/final Integer MAX_TIEMS=3;/**成功状态*/static final String STATUS_SUCCESS="200";/**异常状态*/static final String STATUS_FAIL="500";public void methodA(){Boolean flag=Boolean.FALSE;for (Integer i = 0; i < MAX_TIEMS; i++) {String status = businessHandle();if(STATUS_SUCCESS.equals(status)){flag=true;break;}}if (flag){throw new RuntimeException("方法执行失败");}}/**业务逻辑处理*/public String businessHandle(){return null;}
其他接口的重试代码也大致是这样,A同学是一个有代码洁癖的程序员,重复的代码高频出现,肯是不能忍受的。于是,A同学马上对代码进行了重新梳理,梳理结果如下:
1.几个接口里面都需要包含重试的功能,且重试的框架是固定的,这部分是不是可以抽象出来。
2.方法里面执行的业务逻辑不固定且业务参数不固定,这部分是否可以直接用lambda表达式来进行处理。
说干就干,A同学马上就完成了代码的重构操作,代码结构大致如下:
/**服务类*/
public class BusinessService {public void methodA(){RetryStrategy retryStrategy = new RetryStrategy();//重试retryStrategy.retry(this::businessHandle);}/**业务逻辑处理*/public String businessHandle(){return null;}
}/**重试策略*/
public class RetryStrategy {/**最大执行次数*/final Integer MAX_TIEMS=3;/**成功状态*/static final String STATUS_SUCCESS="200";/**异常状态*/static final String STATUS_FAIL="500";/**业务重试*/public void retry(Supplier<String> supplier){Boolean flag=Boolean.FALSE;for (Integer i = 0; i < MAX_TIEMS; i++) {String status = supplier.get();if(STATUS_SUCCESS.equals(status)){flag=true;break;}}if (flag){throw new RuntimeException("方法执行失败");}}}
你们在项目中,使用什么优雅的方式来进行方法重试呢,欢迎评论区评论!