引入jar包
<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.6</version>
</dependency>
启动类添加@EnableRetry.
Demo:
@Service("service")
public class RetryService {
@Retryable(value = IllegalAccessException.class, maxAttempts = 5,
backoff= @Backoff(value = 1500, maxDelay = 100000, multiplier = 1.2))
public void service() throws IllegalAccessException {
System.out.println("service method...");
throw new IllegalAccessException("manual exception");
}
@Recover
public void recover(IllegalAccessException e){
System.out.println("service retry after Recover => " + e.getMessage());
}
}
@EnableRetry - 表示开启重试机制
@Retryable - 表示这个方法需要重试,它有很丰富的参数,可以满足你对重试的需求
@Backoff - 表示重试中的退避策略
@Recover - 兜底方法,即多次重试后还是失败就会执行这个方法
SimpleRetryPolicy
默认最多重试3次
TimeoutRetryPolicy
默认在1秒内失败都会重试
ExpressionRetryPolicy
符合表达式就会重试
CircuitBreakerRetryPolicy
增加了熔断的机制,如果不在熔断状态,则允许重试
CompositeRetryPolicy
可以组合多个重试策略
NeverRetryPolicy
从不重试(也是一种重试策略哈)
AlwaysRetryPolicy
总是重试
FixedBackOffPolicy
默认固定延迟1秒后执行下一次重试
ExponentialBackOffPolicy
指数递增延迟执行重试,默认初始0.1秒,系数是2,那么下次延迟0.2秒,再下次就是延迟0.4秒,如此类推,最大30秒。
ExponentialRandomBackOffPolicy
在上面那个策略上增加随机性
UniformRandomBackOffPolicy
这个跟上面的区别就是,上面的延迟会不停递增,这个只会在固定的区间随机
StatelessBackOffPolicy
这个说明是无状态的,所谓无状态就是对上次的退避无感知,从它下面的子类也能看出来