SpringBoot重试机制

SpringBoot重试机制

spring-retry是SpringFramework中的一个模块,使用它可以向代码添加重试逻辑。在spring-retry中,所有配置都是基于简单注释的,在方法上添加@Retryable即可。

引入依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

开启

只有启用@EnabelRetry才行,写在配置类、启动类或services上都可以。

1
2
3
4
5
6
7
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.annotation.EnableRetry;

@Configuration
@EnableRetry
public class RetryConfig {
}

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
@EnableRetry
public class TestRetryServiceImpl implements TestRetryService {

@Override
@Retryable(value = Exception.class,maxAttempts = 4,backoff = @Backoff(delay = 2000,multiplier = 1.5))
public int test(int code) throws Exception {
System.out.println("test开始" + LocalTime.now());
if (code == 0){
throw new Exception("test");
}
System.out.println("test结束" + LocalTime.now());
return 200;
}
}

@Retryable参数

参数 描述
value 指定重试的异常,默认为空。include的同义词,如果excludes也为空,则重试所有异常
include 指定重试的异常,默认为空
exclude 指定不重试的异常,默认为空
maxAttempts 最大重试次数,默认3次
backoff 重试等待策略,默认使用@Backoff

@Backoff参数

参数 描述
value 重试间隔时间,单位毫秒,默认1000
multiplier 重试间隔时间倍数,默认为0。若value为2,multiplier为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒

回调

当重试耗尽后,可以使用@Recover注解,使RetryOperations传递给一个回调方法,即RecoveryCallback。用于@Retryable重试失败后的处理方法。如果不需要回调方法,可以不写回调方法。

1
2
3
4
5
@Recover
public int recover(Exception e, int code) {
System.out.println("回调方法执行!!!!");
return 400;
}

注意

  1. 重试耗尽后,如果还没成功符合业务判断,则抛出异常。
  2. 回调方法与重试方法需写在同一个实现类里。
  3. 回调方法的返回值必须与重试方法一致。
  4. 回调方法的第一个参数,必须是Throwable类型。
  5. 重试方法内不能使用try catch,只能往外抛异常
  6. 由于spring-retry用到了aspect增强,所以在类里自调用重试方法会失效。
如果对您有帮助,可以打赏呦!