@Configuration@EnableRetrypublic class Application {@Beanpublic Service service() {return new Service();}@Bean public RetryListener retryListener1() {return new RetryListener() {...}}@Bean public RetryListener retryListener2() {return new RetryListener() {...}}}@Serviceclass Service {@Retryable(RemoteAccessException.class)public service() {// ... do something}}
可以使用 @Retryable 的属性类控制 RetryPolicy 和 BackoffPolicy
@Serviceclass Service {@Retryable(maxAttempts=12, backoff=@Backoff(delay=100, maxDelay=500))public service() {// ... do something}}
如果希望在重试用尽时采用替代代码返回,则可以提供恢复方法 。方法应该声明在与@Retryable实例相同的类中,并标记为@Recover 。返回类型必须匹配@Retryable方法 。恢复方法的参数可以包括抛出的异常和(可选地)传递给原始可重试方法的参数(或者它们的部分列表,只要在需要的最后一个之前不省略任何参数) 。
@Serviceclass Service {@Retryable(RemoteAccessException.class)public void service(String str1, String str2) {// ... do something}@Recoverpublic void recover(RemoteAccessException e, String str1, String str2) {// ... error handling making use of original args if required}}
若要解决可选择用于恢复的多个方法之间的冲突,可以显式指定恢复方法名称 。
@Serviceclass Service {@Retryable(recover = "service1Recover", value = https://www.huyubaike.com/biancheng/RemoteAccessException.class)public void service1(String str1, String str2) {// ... do something}@Retryable(recover ="service2Recover", value = https://www.huyubaike.com/biancheng/RemoteAccessException.class)public void service2(String str1, String str2) {// ... do something}@Recoverpublic void service1Recover(RemoteAccessException e, String str1, String str2) {// ... error handling making use of original args if required}@Recoverpublic void service2Recover(RemoteAccessException e, String str1, String str2) {// ... error handling making use of original args if required}}
https://github.com/spring-projects/spring-retry
【Spring Retry 重试】
经验总结扩展阅读
- SpringBoot自定义注解+异步+观察者模式实现业务日志保存
- 装配 SpringBoot自动配置流程
- 四十七 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
- SpringCloud怎么迈向云原生?
- Filter Spring中过滤器和拦截器(Interceptor)的区别和联系
- 二 SpringCloud - Eureka注册中心,feign远程调用,hystrix降级和熔断
- 二 【SSM】学习笔记——SpringMVC入门
- 四十六 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
- Springboot 一行代码实现文件上传 20个平台!少写代码到极致
- SpringBoot内置工具类,告别瞎写工具类了