背景
项目调第三方接口的时候需要用到token数据,一旦token失效,调用其他方法将会抛出异常,在其他方法抛出异常后需要重新获取token并再次调用该方法返回正确的数据,所以想到方法重试,借此在网上查了有好几种方法,其中最简便的便是Spring-try包的重试方法了。
实现
导入相关依赖包
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
注意:使用spring-boot不要导错了包,不是spring-boot-starter-retry,上面导入的包才是正解。
基本实现
@Component
public class MyTest {
@Retryable(value = RuntimeException.class,
maxAttempts = 3,
backoff = @Backoff(delay = 5000L, multiplier = 2))
public String call() {
throw new RuntimeException("RPC调用异常");
}
@Recover
public void recover(RemoteAccessException e) {
System.out.println(e.getMessage());
}
}
在需要重试的方法上面添加@Retryable注解,其中value是重试该方法需要方法抛出的异常类型。maxAttempts是方法重试最大次数(默认为3次),backoff为重试该方法backoff属性,@Backoff中可选填多个属性,示例中delay表示延迟执行时间,multiplier表示计算下一个延迟数的乘数。
其中@Recover是熔断机制,在重试失败时执行。
总结
spring-retry是基于异常来对方法重试进行控制的,如果需要通过对象的属性来控制方法重试可以使用guava-retrying,在此不再多讲。
本文参考了该博客,里面一步一步实现方法重试,建议要深入了解的可自行前往:
https://blog.51cto.com/9250070/2156431