- 内容简介
- 前言
- 第 1 章 第一个 Spring Boot 项目
- 第 2 章 集成 MySQL 数据库
- 第 3 章 集成 Spring Data JPA
- 第 4 章 使用 Thymeleaf 模板引擎
- 第 5 章 Spring Boot 事务支持
- 第 6 章 使用过滤器和监听器
- 第 7 章 集成 Redis 缓存
- 第 8 章 集成 Log4j 日志
- 8.3 使用 Log4j 记录日志
- 第 9 章 Quartz 定时器和发送 Email
- 第 10 章 集成 MyBatis
- 第 11 章 异步消息与异步调用
- 第 12 章 全局异常处理与 Retry 重试
- 第 13 章 集成 MongoDB 数据库
- 第 14 章 集成 Spring Security
- 第 15 章 Spring Boot 应用监控
- 第 16 章 集成 Dubbo 和 Zookeeper
- 第 17 章 多环境配置与部署
- 第 18 章 Spring Boot 原理解析
- 参考文献
12.3 Retry 重试机制

12.3.1 Retry 重试介绍
当我们调用一个接口时,可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制。重试的解决方案有很多,比如利用 try-catch-redo 简单重试模式,通过判断返回结果或监听异常来判断是否重试,具体可以看如下的例子:
try-catch-redo 重试模式还有可能出现重试无效,解决这个问题的方法是尝试增加重试次数 retrycount 以及重试间隔周期 interval,达到增加重试有效的可能性,因此我们可以利用 try-catch-redo-retry strategy 策略重试模式。具体代码如下:
但是这两种策略有一个共同的问题就是:正常逻辑和重试逻辑强耦合。基于这些问题,对于 Spring-Retry 规范正常逻辑和重试逻辑,将正常逻辑和重试逻辑解耦。Spring-Retry 是一个开源工具包,该工具把重试操作模板定制化,可以设置重试策略和回退策略。同时,重试执行实例保证线程安全。Spring-Retry 重试可以用 Java 代码方式实现,也可以用注解 @Retryable 方式实现,这里 Spring-Retry 提倡以注解的方式对方法进行重试。
12.3.2 Retry 重试机制的使用
使用 Spring 提供的重试策略之前,首先需要在 pom.xml 文件中引入所需的依赖,具体代码如下:
依赖添加完成之后,我们需要在入口类 MySpringBootApplication 中添加注解 @EnableRetry 开启 Retry 重试。完整代码如下:
然后,在 AyUserService 类下添加新接口 findByNameAndPasswordRetry,具体代码如下:
AyUser findByNameAndPasswordRetry(String name, String password);
接口 findByNameAndPasswordRetry 添加完成之后,我们在 AyUserServiceImpl 类下实现接口 findByNameAndPasswordRetry,并在方法中故意抛出业务异常 BusinessException,具体代码如下:
- @Retryable:value 属性表示当出现哪些异常的时候触发重试,maxAttempts 表示最大重试次数默认为 3,delay 表示重试的延迟时间,multiplier 表示上一次延时时间是这一次的倍数。
最后,我们在 AyUserController 类下添加控制层方法 findByNameAndPasswordRetry,在该方法中调用服务层 AyUserServiceImpl 的方法 findByNameAndPasswordRetry。具体代码如下:
12.3.3 测试
代码开发完成之后,重新启动 my-spring-boot 项目,项目运行成功之后,在浏览器中输入访问地址:http://localhost:8080/ayUser/findByNameAndPasswordRetry,由于方法 findByNameAndPasswordRetry 会抛出 BusinessException 异常,故 Retry 重试机制会检测到:进行第 2 次重试,重试成功,方法执行完成,重试失败,按照配置延迟 delay 时间,依次进行第 3 次、第 4 次、第 5 次重试,直到重试成功或者达到最大重试次数,重试策略终止。我们可以在 IDEA 的控制台多次看到如下打印信息:
[findByNameAndPasswordRetry]方法失败重试了!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论