返回介绍

12.3 Retry 重试机制

发布于 2025-04-26 13:53:53 字数 2704 浏览 0 评论 0 收藏

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。