spring-retry解决重试

2023-02-19  本文已影响0人  AC编程

一、前言

在日常开发过程中,难免会与第三方接口发生交互,例如:短信发送、远程服务调用、争抢锁等场景,当正常调用发生异常时,例如:网络抖动,这些间歇性的异常在一段时候之后会自行恢复,程序为了更加健壮并且更不容易出现故障,需要重新触发业务操作,以防止间歇性的异常对程序照成的影响。常用的重试策略,比如通过 while 循环手动重复调用或是通过 JDK/CGLib 动态代理的方式来进行重试。但是这种方法比较笨重,且对原有逻辑代码的入侵性比较大。

二、引入spring-retry

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

这里我们还引入了 aop 的依赖,因为 spring-retry 的原理就是基于 aop 来实现的。

三、开启spring-retry

启动类上增加注解@EnableRetry

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

四、@Retryable

在需要重试的方法上增加注解@Retryable,表示该方法需要重试。

@Component
public class TestRetry {

    int a = 0;

    @Retryable(value = {RuntimeException.class}, maxAttempts = 5, backoff = @Backoff(delay = 1000, multiplier = 2))
    public String test() {
        a++;
        System.out.println(a + " - " + System.currentTimeMillis());
        if (a < 10) {
            throw new RuntimeException("未满足条件");
        }
        return "执行成功";
    }
}
4.1 @Retryable 注解
4.2 @Backoff 注解

五、重试耗尽

当重试耗尽时,RetryOperations 可以将控制传递给另一个回调,即 RecoveryCallback。Spring-Retry 还提供了@Recover注解,用于@Retryable重试失败后处理方法。若不需要重试失败后的处理方法,则不写回调方法,重试耗尽后抛出异常。

@Recover
public String recoverTest(RuntimeException e) {
    return "回调方法-" + e.getMessage();
}

说明:

若同一个实现类中有多个回调方法,我们需要使用 recover 属性指定回调的方法名

@Component
public class TestRetry {

    int a = 0;

    @Retryable(recover = "recoverTest1", value = {RuntimeException.class}, maxAttempts = 5, backoff = @Backoff(delay = 1000, multiplier = 2))
    public String test() {
        a++;
        System.out.println(a + " - " + System.currentTimeMillis());
        if (a < 10) {
            throw new RuntimeException("未满足条件");
        }
        return "执行成功";
    }

    @Recover
    public String recoverTest(RuntimeException e) {
        return "回调方法-" + e.getMessage();
    }

    @Recover
    public String recoverTest1(RuntimeException e) {
        return "回调方法1-" + e.getMessage();
    }
}

指定了回调方法为 recoverTest1

六、注意事项

转载自:【SpringBoot】75、SpringBoot中使用spring-retry轻松解决重试

上一篇 下一篇

猜你喜欢

热点阅读