背景
好的代码应该具备健壮性,比如代码里面调用了一个http请求,如果当时网络抖了下,http就调用失败了,这时候我们往往需要重试,本文我们就来介绍一个功能比较完善的重试组件-Retryer。
实例
我们需要针对接口accountFeignClient.getAccount在出现错误异常时,进行重试
1.添加配置注解@EnableRetry,开启重试功能
在配置类中新增注解@EnableRetry
@EnableRetry
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
public class XXXApplication {
...
}
2.封装被调用的接口–需要重试的接口
(1)@Retryable注解定义了重试次数(maxAttempts),间隔时间(value),间隔频率(1.5倍),即每隔1.5秒重试一次
@Service
public class RetryService {
@Autowired
private AccountFeignClient accountFeignClient;
@Retryable(maxAttempts = 3,backoff= @Backoff(value = 1000,multiplier = 1.5))
public BaseAccountResponse test(){
System.out.println("retry service test");
BaseAccountResponse baseAccountResponse = accountFeignClient.getAccount(729060943550464L).getBody();
return baseAccountResponse;
}
@Recover
public BaseAccountResponse testRetry(){
BaseAccountResponse baseAccountResponse = new BaseAccountResponse();
baseAccountResponse.setName("xxx");
return baseAccountResponse;
}
}
3. 调用接口
@RequestMapping(value = "/test", method = RequestMethod.GET)
public BaseAccountResponse test(@RequestParam("accountId") String accountId){
System.out.println("facade test");
return retryService.test();
}
参考:
https://www.jianshu.com/p/e51502612673
https://www.baeldung.com/spring-retry