什么时候需要重处理?
在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败,调用远程服务失败,争抢锁失败,等等,这些错误可能是因为网络波动造成的,等待过后重处理就能成功.通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码.然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能.
1、增加spring-retry依赖:
<retry.version>1.2.5.RELEASE</retry.version>
<!--retry-->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>${retry.version}</version>
</dependency>
2、在相应的方法上加上注解:
/**
* 测试重试
*
* @Retryable的参数说明: •value:抛出指定异常才会重试,为空时所有异常都重试
* •include:和value一样,默认为空,当exclude也为空时,默认所有异常
* •exclude:指定不处理的异常
* •maxAttempts:最大重试次数,默认3次
* •backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L;表示第一次重试延迟1秒;
* multiplier(指定延迟倍数)默认为0,我们设置2,表示第一次重试延迟1秒,第二次2秒,第三次4秒;
*/
@Retryable(value = RetryException.class, maxAttempts = 3, backoff = @Backoff(value = 1000L, multiplier = 2))
BaseResponse testRetry();
3、在启动类上添加注解
@EnableRetry
4、 在指定方法上标记@Recover来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中)
@Recover
public void recover(A异常 e) {
// ... do something
}
@Recover
public void recover(B异常 e) {
// ... do something
}