java重试工具库: 实现业务逻辑与重试逻辑的解耦

2023-11-07

对于开发过网络应用程序的程序员来说,重试并不陌生,由于网络的拥堵和波动,此刻不能访问服务的请求,也许过一小段时间就可以正常访问了。比如下面这段给某个手机号发SMS的伪代码:

  1. // 发送SMS
  2. public boolean sendSMS(String phone, String content)
  3. {
  4. int retryTimes = 3;
  5. for( int i= 0; i<= 3; i++)
  6. {
  7. try
  8. {
  9. boolean result = doSomething(phone, content);
  10. // 发送成功直接返回
  11. if(result == true)
  12. {
  13. return true;
  14. }
  15. }
  16. catch(IOException e)
  17. {
  18. // 可能是网络问题导致IOException,所以我们继续重试
  19. logger.error( "send sms error", e);
  20. }
  21. catch(Exception e)
  22. {
  23. // 未知异常,与网络无关,有可能是代码出现问题,这个时候重试没用,我们直接返回false
  24. logger.error( "unknown exception", e);
  25. return false;
  26. }
  27. }
  28. return false;
  29. }
  30. // 给某人发短信
  31. private boolean doSomething(String phone, String content)
  32. {
  33. }


这段代码有什么问题呢?看起来很丑,为了实现重试逻辑,各种if-else,各种try-catch。重试逻辑太简单,只是控制了重试次数,并没有控制2次重试之间的时间间隔。因为重试代码与业务代码耦合在一起,所以看起来很复杂。


试想如果我们要改变重试逻辑:比如我们希望每次重试过后,随机等待一段时间后再重试;比如我们希望重试次数不超过10次,而且总共的重试时间不超过1分钟;比如我们希望每次重试的时候,都给我们监控系统发一条消息...随着重试逻辑的不断变化,上面代码会越来越复杂。而且重试逻辑,其实是各个模块是差别不大的。


最近遇到2个开源项目,都是将重试代码封装成专门的工具,方便使用,比如guava-retrying和spring-retry。后面的文章,会介绍下如何使用guava-retrying。下面这段代码使用的是guava-retrying,明显可以感到代码变简单了。

  1. public boolean sendSMS(final String phone, final String content)
  2. {
  3. Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
  4. .retryIfResult(Predicates.equalTo( false)) // 返回false时重试
  5. .retryIfExceptionOfType(IOException.class) // 抛出IOException时重试
  6. .withWaitStrategy(WaitStrategies.fixedWait( 200, TimeUnit.MILLISECONDS)) // 200ms后重试
  7. .withStopStrategy(StopStrategies.stopAfterAttempt( 3)) // 重试3次后停止
  8. .build();
  9. try {
  10. return retryer.call( new Callable<Boolean>() {
  11. @Override
  12. public Boolean call() throws Exception {
  13. return doSomething(phone, content);
  14. }
  15. });
  16. } catch (Exception e) {
  17. return false;
  18. }
  19. }



这2个项目github地址是:

https://github.com/rholder/guava-retrying

https://github.com/spring-projects/spring-retry


guava-retrying博文如下:

guava-retrying重试工具库: 什么时候重试

guava-retrying重试工具库: 什么时候终止

guava-retrying重试工具库: 隔多长时间重试

guava-retrying重试工具库: 阻塞策略BlockStrategy

guava-retrying重试工具库: AttemptTimeLimiter

guava-retrying重试工具库: RetryListener

guava-retrying重试工具库: Retryer.call()使用注意事项



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aitangyong/article/details/53840719
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java重试工具库: 实现业务逻辑与重试逻辑的解耦 的相关文章

随机推荐

  • 4_hytrix_信号量_线程池

    文章目录 Hystrix 核心特性和原理 使用 单独使用 整合 Feign 整合RestTemplate 信号量与线程隔离 线程池隔离 信号量隔离 常用配置 hystrix 使用dashboard Hystrix 核心特性和原理 熔断 连续
  • C strtok strtok_s 函数说明 按分隔符分解字符串

    1 说明 1 1 函数签名如下 char strtok char str const char delimiters 1 str 要被分解成一组小字符串的字符串 2 delimiters 包含分隔符的 C 字符串 1 2 返回值 该函数返回
  • DPDK的PMD(uio/igb_uio/vfio-pci/uio_pci_generic)

    目录 linux收包的方式 中断对性能的影响有多大 轮询对性能的提升有多大 PMD 介绍 收包对比 内核收包的弊端 DPDK 收包的优点 uio igb uio uio pci generic vfio pci igb uio IGB UI
  • MATLAB算法实战应用案例精讲-【集成算法】集成学习模型stacking(附Python和R语言代码)

    目录 前言 几个高频面试题目 1 哪种集成技术更优 什么情况下选择哪种集成技术呢
  • Java多线程技术详解(全都是细节!)

    多线程启动 线程有两种启动方式 实现Runnable接口 继承Thread类并重写run 方法 1 Thread 与 Runnable Runnable接口表示线程要执行的任务 当Runnable中的run 方法执行时 表示线程在激活状态
  • fisco bcos用caliper0.2.0进行压力测试的安装配置

    一 前期环境 1 硬件 需要外网权限 2 操作系统 版本要求 Ubuntu gt 16 04 CentOS gt 7 MacOS gt 10 14 3 基础软件 python 2 7 make g gcc git sudo apt inst
  • 中医处方软件_重磅上线:中医传承计算平台V3.0正式推出

    重要小贴士 为进一步提高期刊论文质量和水平 更为深度的传承和传播名医经验 中医传承计算平台研发团队联合中药大品种联盟将于2020年7月24 26日在贵阳举办中医药科研论文与SCI写作培训会议 该培训班围绕名医学术思想 经验总结 毕业论文设计
  • win10下MYSQL的下载、安装以及配置超详解教程~~小白入

    下载MYSQL 官网下载MYSQL5 7 21版本 链接地址https www mysql com downloads 下载流程图如下 进入官网点击Community 下载社区版 找到MYSQL Community Server 点击下方D
  • 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式

    一 系统吞度量要素 一个系统的吞度量 承压能力 与request对CPU的消耗 外部接口 IO等等紧密关联 单个reqeust 对CPU消耗越高 外部系统接口 IO影响速度越慢 系统吞吐能力越低 反之越高 系统吞吐量几个重要参数 QPS T
  • stm32 GPIO输入输出

    GPIO 通用输入输出口 可配置为8种输入输出模式 输出模式下可控制端口输出高低电平 用以驱动LED 控制蜂鸣器 模拟通信协议输出时序等 输入模式下可读取端口的高低电平和电压 用于读取按键输入 外接模块电平信号输入 ADC电压采集 模拟通信
  • qt中实现绘制图形与截图

    引言 实现可以选择线型 线宽 颜色 是否填充图形来绘制各种常见的图形 同时可以选择矩形区域来实现截图 效果 绘图的效果如上 截图的效果 实现 项目使用的qt5 13 2 编译器为MSVC2017 64bit 该项目是基于基类QWidget创
  • 多重继承和多继承, super, __mro__

    继承 父类派生子类 子类继承父类 通过继承 可以让子类去拥有父类中的属性和方法 而不必重新编写相同的代码 并且可以在父类的基础上添加新的属性和功能 在继承的同时 子类还可以重写父类中的方法 从而获取与父类不同的功能 实现多态 在 Pytho
  • 【华为OD机试真题 JS】报数游戏

    标题 报数游戏 时间限制 1秒 内存限制 262144K 语言限制 不限 100个人围成一圈 每个人有一个编码 编号从1开始到100 他们从1开始依次报数 报到为M的人自动退出圈圈 然后下一个人接着从1开始报数 直到剩余的人数小于M 请问最
  • TypeScript中的keyof、typeof、索引访问类型、条件类型

    一 keyof类型操作符 TypeScript中的keyof类型操作符可以获取某个类型的所有属性名组成的联合类型 这个操作符的作用是帮助开发者在静态类型检查中更准确地操作属性名 举例来说 如果我们有如下一个接口 interface Pers
  • Xcode多视图应用Tab Bar Controller、Table View Controller2021-04-10

    1 视图控制器 首先应该理解Xcode里的视图控制器一般以controller结尾 在storyboard中添加的每一个视图控制器都有一个默认的名字如View Controller 标识符 可以修改视图控制器的title属性 改它的名字 点
  • 编译执行与解释执行的区别

    今天在看到一篇关于分层编译优化的文章时 看到了解释执行与编译执行两个专业词汇 看着熟悉 但不甚理解 然后在网上搜索了一下 说一下自己的理解 对于我们平时写的代码 一般计算机是没办法直接识别的 需要相应的编译器将其编译层机器代码 一些计算机可
  • AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费

    一 lexica art 该网站拥有数百万Stable Diffusion案例的文字描述和图片 可以为大家提供足够的创作灵感 使用上也很简单 只要在搜索框输入简单的关键词或上传图片 就能为你提供大量风格不同的照片 点击照片就能看到完整的AI
  • uniapp调用地图,进行位置查询,标记定位

    这周开会又新增一个小功能 就是需要通过身份证号 手机号在地图查询 后台返回经纬度 标记位置 想着挺麻烦 做的时候发现没啥技术 分享给大家
  • JDK,JRE和JVM三者间关系

    JDK是什么 JDK Java Development Kit Java开发工具包 是针对Java开发程序员的产品 是整个Java的核心 包含Java运行环境JRE Java工具和Java基础类库 具有3个主要组成部分 1 Java 编程语
  • java重试工具库: 实现业务逻辑与重试逻辑的解耦

    对于开发过网络应用程序的程序员来说 重试并不陌生 由于网络的拥堵和波动 此刻不能访问服务的请求 也许过一小段时间就可以正常访问了 比如下面这段给某个手机号发SMS的伪代码 发送SMS public boolean sendSMS Strin