download:移动互联网高级开发正式课VIP课程-码牛第二期
一个Java注解@Recover搞定丑陋的循环重试代码
运用背景
在实践项目中其中一局部逻辑可能会由于调用了外部效劳或者等候锁等状况下呈现不可意料的异常,在这个时分我们可能需求对调用这局部逻辑停止重试,代码里面主要就是运用for循环写一大坨重试的逻辑,各种硬编码,各种辣眼睛的补丁。
【移动互联网高级开发正式课VIP课程码牛第二期源码齐全】特别是针对重试的逻辑,四处都有。所以我决议用一个重试组件spring-retry优化一波。它的呈现,处理掉这局部丑陋的代码!
2开端上代码
首先引入依赖:
org.springframework.retry
spring-retry
1.3.2
复制代码
由于该组件是依赖于 AOP 给你的,所以还需求引入这个依赖(假如你其他 jar 包中援用过了,当然也就不需求再次援用了):
org.springframework.boot
spring-boot-starter-aop
2.6.1
复制代码
开启重试:
@SpringBootApplication
@EnableRetry
public class ApplicationStarter {
public static void main(String[] args) {
SpringApplication.run(ApplicationStarter.class);
}
}
复制代码
Controller层
@RestController
public class TestController {
@Autowired
private IRecursiveCallService recursiveCallService;
@GetMapping("test2")
public Object test2() {
return recursiveCallService.testService();
}
}
复制代码
Service层
public interface IRecursiveCallService {
/**
* 测试service
*
* @return
*/
List testService();
}
复制代码
Service层详细完成
@Service
public class RecursiveCallServiceImpl implements IRecursiveCallService {
@Override
@Retryable(recover = "testService3")
public List testService() {
System.out.println("到此一游!");
System.out.println(1 / 0);
return null;
}
@Recover
public List testService1() {
System.out.println("错误的返回");
return Collections.singletonList("S");
}
@Recover
public List testService2(String i) {
System.out.println("正确的返回");
return Collections.singletonList(1);
}
@Recover
public List testService3() {
System.out.println("正确的返回2");
return Collections.singletonList(2);
}
}
-`recover`: 此类中用于恢复的办法的称号。办法必需用 {@link Recover} 注释标志。
-`value`: 可重试的异常类型。包括()的同义词。默许为空(假如 excludes 也为空,则重试一切异常)。
-`exclude`: 不可重试的异常类型。默许为空(假如包含也为空,则重试一切异常)。假如 include 为空但 excludes 不是,则重试一切未扫除的异常
-`maxAttempts`: 办法重试调用次数,默许3次
-`backoff`: 指定用于重试此操作的其他属性
## 4@backoff注解
-`value`:重试之间距离时间
-`delay`:重试之间的等候时间(以毫秒为单位)
-`maxDelay`:重试之间的最大等候时间(以毫秒为单位)
-`multiplier`:指定延迟的倍数
-`delayExpression`:重试之间的等候时间表达式
-`maxDelayExpression`:重试之间的最大等候时间表达式
-`multiplierExpression`:指定延迟的倍数表达式
-`random`:随机指定延迟时间
## 5@Recover注解
主要作用是标志办法为一个重试办法的补偿办法!!!
## 6留意事项
-办法重试依赖于 spring 注入,所以调用的办法的类必需是被spring管理的,然后经过 @Autowired 或 @Resource 引入运用,不然不会生效
-办法重试的前提是办法抛出了异常,在办法执行呈现了异常且没有被捕获的状况下重试
-办法重试需求在办法上面加上注解 @Retryable
-办法重试的补偿办法上面必需携带@Recover注解
-@Recover办法需求和@Retryable办法在同一个类中才干生效@Recover办法(@Recover办法在父类中也能够生效)
-运用@Retryable注解,假如类中没有被@Recover标示的办法,无论能否运用 recover 属性都抛出原有异常
-运用@Retryable注解同时 recover 属性不是空,假如类中有@Recover标示的办法,但是标示的办法不是 recover 指定的办法,抛出ExhaustedRetryException异常
-运用@Retryable注解同时 recover 属性不是空,同时办法有注解@Recover,但是补偿办法的参数不是当前异常或者异常的父类,抛出ExhaustedRetryException 异常
-运用@Retryable注解不运用 recover 属性,假如类中被@Recover标示的办法有和原办法返回值一样的,运用当前被@Recover标示的办法