java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Retry重试

Spring Retry重试框架的使用讲解

作者:記億揺晃着的那天

重试的使用场景比较多,比如调用远程服务时,由于网络或者服务端响应慢导致调用超时,此时可以多重试几次。用定时任务也可以实现重试的效果,但比较麻烦,用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重试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文