在实际项目中其中一部分逻辑可能会因为调用了外部服务或者等待锁等情况下出现不可预料的异常,在这个时候我们可能需要对调用这部分逻辑进行重试,代码里面主要就是使用for循环写一大坨重试的逻辑,各种硬编码,各种辣眼睛的补丁。
特别是针对重试的逻辑,到处都有。所以我决定用一个重试组件spring-retry优化一波。它的出现,解决掉这部分丑陋的代码!
这个组件的源码地址如下:https://github.com/spring-projects/spring-retry

废话不多说,直接上代码吧!
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.3.2</version></dependency>由于该组件是依赖于 AOP 给你的,所以还需要引入这个依赖(如果你其他 jar 包中引用过了,当然也就不需要再次引用了):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.6.1</version></dependency>@SpringBootApplication@EnableRetrypublic class ApplicationStarter { public static void main(String[] args) { SpringApplication.run(ApplicationStarter.class); }}@RestControllerpublic class TestController {@Autowiredprivate IRecursiveCallService recursiveCallService; @GetMapping("test2") public Object test2() { return recursiveCallService.testService(); }}public interface IRecursiveCallService { /** * 测试service * * @return */ List<Integer> testService();}@Servicepublic class RecursiveCallServiceImpl implements IRecursiveCallService { @Override @Retryable(recover = "testService3") public List<Integer> testService() { System.out.println("到此一游!"); System.out.println(1 / 0); return null; } @Recover public List<String> testService1() { System.out.println("错误的返回"); return Collections.singletonList("S"); } @Recover public List<Integer> testService2(String i) { System.out.println("正确的返回"); return Collections.singletonList(1); } @Recover public List<Integer> testService3() { System.out.println("正确的返回2"); return Collections.singletonList(2); }}主要作用是标记方法为一个重试方法的补偿方法!!!