背景: 在实际项目中,咱们在与其余第三方业务接口进行交互时,可能会由于一些网络波动致使超时失败,可是并不能只一次失败就断定接口请求失败,应该考虑重试屡次后若是仍然失败,才返回请求失败。spring
解决方案:markdown
解决方案一:try-catch 简单重试网络
经过判断返回结果或监听异常断定是否重试,同时为了解决当即重试的无效执行(假设异常是有外部执行不稳定致使的),休眠必定延迟时间从新执行功能逻辑。测试
可是这样会存在一个问题,那就是若是是请求参数不正常,那么就会一直重试下去,变成了死循环。spa
这样确定不是咱们想要的解决方案,因此咱们须要添加限制,判断重试多少次之后仍然失败,就返回失败结果。3d
而后此次再看执行结果,此次就按照咱们设置的次数进行重试了,已经达到了业务需求code
结论:try-catch再加上提早设定重试次数,这样已能够知足咱们重试机制了,可是有没有更简单的方法呢?答案是确定的。orm
解决方案二:Spring @Retryable 注解实现接口
@Retryable是Spring提供的可重试注解,为了使用spring提供的重试机制ip
在pom文件中添加相应的依赖
<!-- spring retry 自动重试机制-->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!-- spring retry 自动重试机制-->
复制代码
启动类添加注解
@EnableRetry
复制代码
在须要重试的方法上添加注解@Retryable
@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 1.5))
复制代码
而后继续执行测试方法、结果发现执行了三次,而后输出请求失败语句。
可是只是这样并不知足咱们实际业务,在实际业务中若是超太重试以后,通常须要记录本次失败缘由,而且调用补偿方法进行业务处理,与消息推送,因此咱们可使用@Recover注解来实现超出重试次数后执行补偿方法。
可是这里须要注意的是,@Recover声明的方法必须与@Retryable声明的方法返回值一致,否则补偿方法会不生效。
如下是Spring自动重试注解的说明
@Retryable注解中的参数说明:
maxAttempts :最大重试次数,默认为3,若是要设置的重试次数为3,能够不写;
value:抛出指定异常才会重试
include:和value同样,默认为空,当exclude也为空时,默认因此异常
exclude:指定不处理的异常
backoff:重试等待策略,默认使用@Backoff@Backoff的value默认为1000L,咱们设置为2000L。
@Backoff注解中的参数说明:
value:隔多少毫秒后重试,默认为1000L,咱们设置为3000L;
delay:和value同样,可是默认为0;
multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,若是把multiplier设置为1.5,
则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
复制代码
若是对您有帮助 请点个关注,万分感谢