当前位置: 首页 > news >正文

优雅的系统重试

进入正题之前,先引入这样一个场景:

最近,程序员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("方法执行失败");}}}

 你们在项目中,使用什么优雅的方式来进行方法重试呢,欢迎评论区评论!

http://www.lqws.cn/news/160525.html

相关文章:

  • 如何轻松将视频从安卓设备传输到电脑?
  • 检测到 #include 错误。请更新 includePath。已为此翻译单元(D:\软件\vscode\test.c)禁用波形曲线
  • 【SSM】SpringMVC学习笔记8:拦截器
  • qt ui 转python
  • YAML在自动化测试中的三大核心作用
  • C++11 尾随返回类型:从入门到精通
  • Linux服务器如何安装wps?
  • 【案例】电商系统的AI微服务架构设计
  • C语言输入函数
  • 使用Python提取照片元数据:方法与实战指南
  • 炫云:为驱动数字视觉产业升级保驾护航
  • 解锁Java线程池:性能优化的关键
  • 八皇后问题深度解析
  • 11 - ArcGIS For JavaScript -- 高程分析
  • 图像分类进阶:从基础到专业 (superior哥AI系列第10期)
  • 窗口聚合窗口聚合
  • 倍福 PLC程序解读
  • NLP驱动网页数据分类与抽取实战
  • Linux(12)——基础IO(下)
  • YOLO在QT中的完整训练、验证与部署方案
  • TIA博途中的程序导出为PDF格式的具体方法示例
  • 系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
  • tcp/udp
  • 网页前端开发(基础进阶4--axios)
  • Neo4j 完全指南:从入门到精通
  • js 比较两个对象的值,不相等就push对象的key
  • 平台升级:新功能与新模型震撼登场!
  • 华硕电脑,全新的超频方式,无需进入BIOS
  • uniapp实现的简约美观的星级评分组件
  • rust或tauri项目执行命令的时候,cmd窗口也会弹出显示解决方法