java 重试
@Retryable注解,其中:
value : 指定发生的异常进行重试
include : 同value , 默认"" , 当exclude也为空时 , 所有异常都重试
exclude : 排除不重试的异常 , 默认"" , 当include也为空时 , 所有异常都重试
maxAttemps : 尝试次数 , 默认3 . 注意该值包含第一次正常执行的次数 , 即失败之后重新尝试2次 , 一共执行3次
backoff : 重试补偿机制 , 默认无 , 属性配置如下
delay : 延迟指定时间后(单位毫秒)重试
multiplier : 指定延迟的倍数 , 每次执行间隔加倍延迟 . 如delay=5000L,multiplier=2 , 第一次重 试为5S后 , 第二次为第一次的10S后 , 第三次为第二次的20S后@Recover注解,其中:
当重试次数达到限定时 , 会执行@Recover注解的补偿方法 , 只有在入参与发生异常匹配时才会执行该补偿方法,即发生的异常类型需要和@Recover注解的参数一致,@Retryable注解的方法不能有返回值,不然@Recover注解的方法无效
@SpringBootApplication
@EnableRetry//启用重试机制
public class RetryApplication {
public static void main(String[] args) {
SpringApplication.run(RetryApplication.class, args);
}
}
/** 出现指定异常时(RuntimeException) , 再重试3次 , 每次延迟5s , 之后每次延迟翻倍*/
@Retryable(include = {RuntimeException.class}, maxAttempts = 4, backoff = @Backoff(delay = 2000L, multiplier = 2))
public void work2() {
System.out.println("执行方法 : " + LocalDateTime.now());
throw new RuntimeException();//模拟异常
}
/** 当重试次数达到限定时 , 会执行@Recover注解的补偿方法 , 只有在入参与发生异常匹配时才会执行该补偿方法 */
@Recover
public void recover(RuntimeException e) {
System.out.println("执行补偿方法 : " + LocalDateTime.now());
}
运行结果:
执行方法:2019-12-31T20:17:48.566
执行方法:2019-12-31T20:17:49.567
执行方法:2019-12-31T20:17:50.568
执行补偿方法:2019-12-31T20:17:50.568