Spring Retry 是 Spring 官方提供的重试框架,作为 Spring 生态系统的一部分,它通过 AOP(面向切面编程)实现了对方法调用的重试能力。当方法调用失败时,Spring Retry 会根据配置的策略自动重新执行该方法,直到成功或达到最大重试次数。
依赖
jdk8 需要使用 1 版本,jdk8 以上可以使用更高版本:
<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.3.3</version>
</dependency>
启动类添加注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;
@EnableRetry
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Service
import com.test.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class RetryService {
// 对发生 BusinessException 情况进行重试,最大重试次数 5 次,初始延迟为 1 秒,每次延迟时间为上一次的 2 倍
@Retryable(
value = {BusinessException.class},
maxAttempts = 5,
backoff = @Backoff(delay = 1000L, multiplier = 2)
)
public void retry() {
double random = Math.random();
if (random > 0.1) {
log.info("方法执行失败,开始重试, random = {}", random);
throw new BusinessException(400, "failed");
} else {
log.info("方法执行成功, random = {}", random);
}
}
// 全部重试失败后,自动执行的恢复方法
@Recover
public void recover() {
log.info("重试失败,执行恢复方法");
}
}
可以从日志时间戳上看出,执行重试的间隔依次是 1 秒、2 秒、4 秒、8 秒,重试 5 次失败后自动执行 recover 方法。