【代码优化与重构技巧】使用@Retryable增加重试机制
引用依赖
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
代码实现
-
启动类加@EnableRetry 对应方法中添加验证重试机制
@Retryable(value = Exception.class,maxAttempts = 10) public String cloudCallUpload1(String waybillNo, String cloudCallType) { Map<String, String> inParamMap = new HashMap<>(); String result = ""; inParamMap.put("waybillNo", waybillNo); inParamMap.put("cloudCallType", cloudCallType); result = stationOpUploadCloudCallFeign.cloudCallUpload(token, inParamMap); log.info("cloudCallUpload_result:{},inParam:{}", result, JSON.toJSONString(inParamMap)); throw new RuntimeException(); }
指定最大尝试次数10次,效果如下:1s重试一次
注解不生效原因
-
启动类没有添加@EnableRetry @Retryable使用了aspect切面增强。当出现方法内部调用时,注解会失效。(只要是使用了切面注解,使用到的注解一般都会失效) 举例:当方法C中使用了Demo类中的A时,而A调用了B。在B处使用了重试的注解,则不会重试。 使用重试机制,在一个方法类调用。此处注解也不会生效。因为没有注入到Spring中。
@Service public class C { @Resource private Demo demo; public void D() { demo.A(); } } @Component public class Demo { public void A() { B(); } //这里B不会执行 @Retryable(Exception.class) public void B() { throw new RuntimeException("retry..."); } }