spring-retry
Retry重试框架,支持AOP切入的方式使用,而且能使用注解;想想,重试次数、重试延迟、重试触发条件、重试的回调方法等等我们都能很轻松结合注解以一种类似配置参数的方式去实现,优雅无疑。。
使用springboot整合retry框架
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId >
<artifactId>aspectjweaver</artifactId >
<version>1.6.11</version >
</dependency>
创建 service
public interface RetrySpringService {
int retrySpringTest(int age);
}
###创建实现类
package com.wwm.retry.retryspring.impl;
import com.wwm.retry.exception.BusinessException;
import com.wwm.retry.exception.ValidException;
import com.wwm.retry.retryspring.RetrySpringService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class RetrySpringServiceImpl implements RetrySpringService {
/**
* include 需要重试的异常
* ValidException 不需要重试的异常
* maxAttempts 最大重试次数(包含正常调用的一次)
*
* backoff:delay 延迟时间 multiplier 每次延迟的间隔时间成倍增加
* @param age
* @return
*/
@Override
@Retryable(include = {Exception.class},exclude = {ValidException.class},maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
public int retrySpringTest(int age) {
if(age == 1){
log.info("重试次数为1");
throw new BusinessException("age为1重试");
}
if(age == 2){
throw new ValidException("age为2不重试");
}
return 0;
}
/**
* 该方法是重试失败后回调,重点 即使你排除的异常,如果写该方法,没有在该方法显示抛出那么异常信息就不会打印
* @param age
* @param e
* @return
*/
@Recover
public int recover(Exception e,int age){
//记录日志 异步处理
//抛出异常 todo
throw new BusinessException(e.getMessage());
}
}
可以看到代码里面,这个方法上面加上了注解
@Retryable(include = {Exception.class},exclude = {ValidException.class},maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
@Retryable :注解方式标记当前方法会使用重试机制
里面的 include :重试的触发机制,当遇到Exception异常的时候,触发;
里面的 exclude :排除重试的触发机制,当遇到Exception异常的时候,触发;
maxAttempts :重试的次数(包括第一次调用,也就是说如果设置3次,调用一次后,如果一直失败触发重试,那么还当前方法还会调用2次);
delay :重试的延迟时间,也就是距离上一次重试方法调用的间隔,单位毫秒
multiplier :delay间隔时间的倍数,也就是说,第一次重试间隔如果是2000ms,那第二次重试的时候就是2000ms 乘以这个倍数1.5,就是3000ms;
maxDelay :重试次数之间的最大时间间隔,默认为0,即忽略,如果小于delay的设置,则默认为30000L;
再来看看下边的小方法
@Recover
public int recover(Exception e,int age){
//记录日志 异步处理
//抛出异常 todo
throw new BusinessException(e.getMessage());
}
这个方法用到了@Recover,也就是用注解方式标记当期方法为回调方法,可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e通知触发这个回调方法)。
PS:该回调方法与重试方法写在同一个实现类里面。
最后在启动类上添加注解
@EnableRetry
最后附上个人demo springretry的github地址: link.