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

Spring Retry(方法重试、方法重新调用)

Spring Retry——方法重试、方法重新调用

    • 简介:
    • 使用
      • 1. 配置
      • 2.使用
    • 总结
    • 注意

简介:

Spring Retry 是一个 Spring Boot 官方提供的支持重试机制的库。它提供了一种简单而灵活的方式来处理方法调用可能失败的情况,通过自动重试失败的操作,提供了一种可靠的方式来处理潜在的异常或错误。
除此之外:Spring Retry 是基于 Spring AOP(Aspect-Oriented Programming)实现的

Spring Retry 使用了 Spring AOP的切面(Aspect)来定义重试的逻辑。切面可以在方法调用之前、之后或抛出异常时执行特定的代码。通过在切面中定义重试的逻辑,Spring Retry 可以自动捕获异常并重新尝试方法调用,而不需要在每个方法上编写重试逻辑。

使用

1. 配置

为了启用 Spring Retry 的支持,首先要在pom.xml 文件中添加以下依赖项

     	<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.1</version></dependency>

因为 Spring Retry 是基于AOP实现的所以我们还要引入aop的相关依赖

  		 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

2.使用

1、在pom.xml文件中配置完之后,我们还要再启动类上添加@EnableRetry注解。

@SpringBootApplication
@EnableRetry
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

2、@Retryable
在需要重试的方法上加上@Retryable注解,当指定的方法抛出异常之后@Retryable抓取到异常并重新调用该方法

    @Retryablepublic void retry (String s){ //123System.out.println(s);System.out.println("###########");throw new RuntimeException();}

控制台输出:

123
###########
123
###########
123
###########

由于没有指定任何异常,因此将尝试重试所有异常。此外,一旦达到最大尝试次数,但仍有异常,就会抛出 ExhaustedRetryException。

  • interceptor:可以通过该参数,指定方法拦截器的bean名称
  • value:抛出指定异常才会重试
  • include:和value一样,默认为空,当exclude也为空时,默认所以异常
  • exclude:指定不处理的异常
  • maxAttempts:最大重试次数,默认3次
  • backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。

3、@Recover
当 @Retryable指定的方法的重试次数用尽之后,程序就会走到 @Recover注解的方法中

   @Retryablepublic void retry (String s){System.out.println(s);System.out.println("###########");throw new RuntimeException();}@Recoverpublic void recover(){System.out.println("======>recover");}

控制台输出:

123
###########
123
###########
123
###########
======>recover

4、RetryTemplate
除此之外 Spring Retry不止可以使用注解的形式还配备了RetryTemplate接口方便以接口的形式使用

@Testpublic void test(){RetryTemplate retryTemplate = RetryTemplate.builder().maxAttempts(3).build();retryTemplate.execute((RetryCallback<Void, RuntimeException>) context -> {// 需要重试的方法调用needRetry();return null;}, (RecoveryCallback<Void>) context -> {// 重试次数达到上限后执行降级操作fallback();return null;});}public void needRetry(){System.out.println("0123456");System.out.println("=======");throw new RuntimeException();}public void fallback(){System.out.println("*******");System.out.println("********");throw new RuntimeException();}

控制台输出:

0123456
=======
0123456
=======
0123456
=======
*******
********

总结

Spring Retry 是一个 Spring Boot 官方提供的支持重试机制的库。它提供了一种简单而灵活的方式来处理方法调用可能失败的情况,通过自动重试失败的操作,提供了一种可靠的方式来处理潜在的异常或错误。

Spring Retry 的主要特点包括:

  • 简单易用:通过在方法上添加 @Retryable 注解,可以轻松启用重试机制。同时,还可以使用 @Backoff 注解来配置指数退避策略。
  • 自定义重试逻辑:通过实现 RetryTemplate 接口,可以自定义重试的逻辑,包括重试次数、休眠时间、异常类型等。
  • 支持多种触发条件:Spring Retry 支持多种触发重试的条件,包括抛出异常、返回特定值等。 集成性好:Spring Retry 与 Spring Boot 集成良好,可以方便地与其他 Spring 功能(如监控、日志等)集成。

Spring Retry 相比递归在处理重试逻辑方面有以下优点:

  • 简单易用:Spring Retry 提供了一种声明式的方式来处理重试逻辑,只需要在方法上添加相应的注解即可。相比之下,递归需要手动编写循环和条件判断,代码相对复杂且容易出错。
  • 可配置性强:Spring Retry 提供了丰富的配置选项,例如重试次数、休眠时间、异常类型等,可以根据实际需求进行灵活配置。而递归的重试机制通常需要手动编写逻辑,难以实现灵活的配置。
  • 资源利用率高:Spring Retry 在重试之间会根据配置进行休眠,避免了无休止的递归调用造成的栈溢出问题。同时,Spring Retry 使用了循环重试机制,每次重试都会重新计算下一次重试的时间,避免了资源的浪费。
  • 扩展性强:Spring Retry 提供了事件通知和自定义策略等扩展点,可以根据实际需求进行定制和扩展。而递归的方式通常难以实现这些高级功能。

注意

在使用过程中,发现当异常被try捕捉到之后将不会触发@Retryable 重试

http://www.lryc.cn/news/280208.html

相关文章:

  • JavaScript音视频,使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地
  • IaC基础设施即代码:使用Terraform 连接 alicloud阿里云
  • Vue3 如何使用移动端调试工具vConsole
  • 【物流管理系统-Python简易版】
  • Vue学习笔记六--Vue3学习
  • 21.在线与离线MC强化学习简介
  • 控制网页的灰度显示
  • 科研绘图(四)火山图
  • 超强站群系统v9.0:最新蜘蛛池优化技术,一键安装,内容无缓存刷新,高效安全
  • torch.fx的极简通用量化教程模板
  • rpc的正确打开方式|读懂Go原生net/rpc包
  • 【信号与系统】【北京航空航天大学】实验二、连续时间系统的时域分析【MATLAB】
  • 【Linux 内核源码分析笔记】系统调用
  • mysql清空并重置自动递增初始值
  • 计算机算法之二分算法
  • 获取当前设备的IP
  • koa2文件的上传下载功能
  • test-02-test case generate 测试用例生成 EvoSuite 介绍
  • 1.单表查询
  • FFmpeg 的使用与Docker安装流媒体服务器
  • Qt QListWidget列表框控件
  • 小知识分享2
  • 【Golang开源项目】Golang高性能内存缓存库BigCache设计与分析
  • Elasticsearch 7.8.0从入门到精通
  • 寻找最富裕的小家庭 - 华为OD统一考试
  • ssm基于Java的药店药品信息管理系统的设计与实现论文
  • Word插件-大珩助手-手写电子签名
  • Edge扩展插件安装位置
  • Git将本地项目上传到Gitee仓库
  • linux环境安装docker