Spring Retry重试框架的使用讲解

 更新时间:2023年01月06日 14:36:34   作者:記億揺晃着的那天  
重试的使用场景比较多,比如调用远程服务时,由于网络或者服务端响应慢导致调用超时,此时可以多重试几次。用定时任务也可以实现重试的效果,但比较麻烦,用Spring Retry的话一个注解搞定所有,感兴趣的可以了解一下

重试框架Spring-Retry是什么

Spring Retry是一个在Spring框架中以声明方式重试操作的框架。 它提供了对Spring框架现有重试支持的扩展,包括RetryTemplate和RetryOperations接口。 Spring Retry提供了几个高级抽象,例如@Retryable、@Recover和RecoveryCallback,这些抽象允许您声明性地指定应该重试哪些方法以及如何处理重试失败。 它还支持使用SpringRestTemplate重试HTTP请求。

Spring Retry在您希望在操作失败时自动重试的情况下非常有用,无论是由于暂时错误还是更持久的失败。 这在重试操作可能会成功的情况下非常有用,并且可以避免您在代码中手动实现重试逻辑。

Spring-Retry如何使用

SpringRetry是一个自动重试失败操作的框架。 它可用于自动重试由于暂时错误(如临时网络中断、速率限制和HTTP 500错误)而失败的操作。

以下是如何使用Spring Retry自动重试失败操作的示例:

1、将SpringRetry依赖项添加到项目中。 例如,如果您正在使用Maven,可以将以下依赖项添加到pom.xml文件中:

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

2、用@Retryable注释您的方法。 这会告诉Spring在方法失败时自动重试该方法。 您可以指定应触发重试的异常类型,以及尝试的最大重试次数。 例如:

@Retryable(value = {ConnectException.class, SocketException.class}, maxAttempts = 3)
public void doSomething() throws Exception {
    // code to execute
}

3、用@Recover注释您的方法。 这告诉Spring如果所有重试都失败了该怎么办。 @Recover方法应具有与@Retryable方法相同的签名,并为导致失败的异常添加一个附加参数。 例如:

@Recover
public void recover(ConnectException e) {
    // code to execute if all retries fail
}

4、在应用程序上下文中启用Spring Retry。 您可以通过将@EnableRetry注释添加到配置类中,或者通过将<retry:annotation-driven/>元素添加到XML配置中来实现这一点。

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

就是这样! 如果doSomething()方法因ConnectException或SocketException而失败,Spring现在将自动重试,最多重试3次。 如果所有重试都失败,将调用recover()方法。

测试

service层

 @Retryable(value = {NullPointerException.class}, maxAttempts = 3, backoff = @Backoff(delay = 5000L, multiplier = 2))
    public void retryableMethod() {
        System.out.println("hello world");
        throw new NullPointerException("空指针异常");
    }

测试方法

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TestRetry {
    @Resource
    private SalesServiceImpl salesServiceImpl;
    @Test
    public void test001() {
        salesServiceImpl.retryableMethod();
    }
}

运行效果

hello world
hello world
hello world
java.lang.NullPointerException: 空指针异常

属性说明

@Retryable 是一个 Spring 注解,它可以在方法级别使用,用于声明该方法是可以重试的。当使用 @Retryable 注解标注的方法抛出异常时,Spring 会自动重试该方法。这对于一些具有一定的不确定性的操作,例如远程调用或者使用外部系统时非常有用,因为这些操作很可能会失败。

你可以使用 @Retryable 注解的 value 属性指定应该重试的异常类型,也可以使用 include 和 exclude 属性来指定应该重试的异常类型。你还可以使用 maxAttempts 属性指定最大重试次数,使用 backoff 属性指定重试之间的间隔,使用 multiplier 属性指定每次重试之间间隔时间的增长倍数。

例如,下面的代码声明了一个可以重试的方法,在方法抛出 ServiceUnavailableException 时会重试三次,重试之间的间隔是 1000 毫秒,每次重试之间的间隔会翻倍:

@Retryable(value = ServiceUnavailableException.class, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2))
public void someMethod() {
  // method implementation
}

重试全部失败的回调方法

@Recover注解指定重试全部失败的回调方法

@Retryable(value = {NullPointerException.class}, maxAttempts = 3, backoff = @Backoff(delay = 5000L, multiplier = 2))
    public void retryableMethod() {
        System.out.println("hello world");
        throw new NullPointerException("空指针异常");
    }
    @Recover
    public void recover() {
        System.out.println("重试全部失败的回调方法");
    }

测试结果

hello world
hello world
hello world
重试全部失败的回调方法

到此这篇关于Spring Retry重试框架的使用讲解的文章就介绍到这了,更多相关Spring Retry重试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot为什么加载不上application.yml的配置文件

    Springboot为什么加载不上application.yml的配置文件

    这篇文章主要介绍了Springboot为什么加载不上application.yml的配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 浅谈js文件引用方式及其同步执行与异步执行

    浅谈js文件引用方式及其同步执行与异步执行

    下面小编就为大家带来一篇浅谈js文件引用方式及其同步执行与异步执行。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Spring Data JPA中 in 条件参数的传递方式

    Spring Data JPA中 in 条件参数的传递方式

    这篇文章主要介绍了Spring Data JPA中 in 条件参数的传递方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot设置默认主页的方法步骤

    SpringBoot设置默认主页的方法步骤

    这篇文章主要介绍了SpringBoot设置默认主页的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Idea去除方法形参参数提示的操作

    Idea去除方法形参参数提示的操作

    这篇文章主要介绍了Idea去除方法形参参数提示的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • MyBatis找不到mapper文件的实现

    MyBatis找不到mapper文件的实现

    这篇文章主要介绍了MyBatis找不到mapper文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Springboot工具类FileCopyUtils使用教程

    Springboot工具类FileCopyUtils使用教程

    这篇文章主要介绍了Springboot内置的工具类之FileCopyUtils的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • 基于Java+SSM实现电影院购票系统

    基于Java+SSM实现电影院购票系统

    今天小编给大家带来一款SSM的电影院售票系统,非常不错的一个项目,是学习​javaweb编程必备。文中的示例代码讲解详细,需要的可以参考一下
    2022-04-04
  • Java阻塞队列中的BlockingQueue接口详解

    Java阻塞队列中的BlockingQueue接口详解

    这篇文章主要介绍了Java阻塞队列中的BlockingQueue接口详解,对于Queue而言,BlockingQueue是主要的线程安全的版本,具有阻塞功能,可以允许添加、删除元素被阻塞,直到成功为止,BlockingQueue相对于Queue而言增加了两个方法put、take元素,需要的朋友可以参考下
    2023-09-09
  • Java编程复用类代码详解

    Java编程复用类代码详解

    这篇文章主要介绍了Java编程复用类代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论