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重试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于spring@aspect注解的aop实现过程代码实例

    基于spring@aspect注解的aop实现过程代码实例

    这篇文章主要介绍了基于spring@aspect注解的aop实现过程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • springboot集成kafka消费手动启动停止操作

    springboot集成kafka消费手动启动停止操作

    这篇文章主要介绍了springboot集成kafka消费手动启动停止操作,本文给大家介绍项目场景及解决分析,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Spring Boot右键maven build成功但是直接运行main方法出错的解决方案

    Spring Boot右键maven build成功但是直接运行main方法出错的解决方案

    这篇文章主要介绍了Spring Boot-右键maven build成功但是直接运行main方法出错的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Spring Boot和Vue前后端分离项目架构的全过程

    Spring Boot和Vue前后端分离项目架构的全过程

    前后端分离是目前互联网开发中比较广泛使用的开发模式,主要是将前端和后端的项目业务进行分离,下面这篇文章主要给大家介绍了关于Spring Boot和Vue前后端分离项目架构的相关资料,需要的朋友可以参考下
    2022-04-04
  • springboot Quartz动态修改cron表达式的方法

    springboot Quartz动态修改cron表达式的方法

    这篇文章主要介绍了springboot Quartz动态修改cron表达式的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • SpringBoot Bean花式注解方法示例下篇

    SpringBoot Bean花式注解方法示例下篇

    这篇文章主要介绍了SpringBoot Bean花式注解方法,很多时候我们需要根据不同的条件在容器中加载不同的Bean,或者根据不同的条件来选择是否在容器中加载某个Bean
    2023-02-02
  • openGauss数据库JDBC环境连接配置的详细过程(Eclipse)

    openGauss数据库JDBC环境连接配置的详细过程(Eclipse)

    这篇文章主要介绍了openGauss数据库JDBC环境连接配置(Eclipse),演示基于JDBC开发的主要步骤,会涉及创建数据库、创建表、插入数据等,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Java中HashMap的初始容量设置方式

    Java中HashMap的初始容量设置方式

    这篇文章主要介绍了Java中HashMap的初始容量设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • feign 调用第三方服务中部分特殊符号未转义问题

    feign 调用第三方服务中部分特殊符号未转义问题

    这篇文章主要介绍了feign 调用第三方服务中部分特殊符号未转义问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 浅谈Redis的key和value大小限制

    浅谈Redis的key和value大小限制

    这篇文章主要介绍了浅谈Redis的key和value大小限制,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论