spring-retry实现重试功能

2022-09-07 13:59:01 浏览数 (1)

今天来学习一下spring-retry实现重试功能,在实际项目中这种场景也是比较常见的,如果我们自己用代码实现,但是这种方式侵入性太强,不够优雅

原理

基于aop来实现的

如果找不到注解则自行添加

代码语言:javascript复制
 <dependency>
  <groupId>org.springframework.retry</groupId>
  <artifactId>spring-retry</artifactId>
 </dependency>

org.aspectjaspectjweaver

步骤

启用重试功能,添加@EnableRetry

代码语言:javascript复制
@EnableRetry
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }

}

在方法上添加@Retryable

代码语言:javascript复制
@Service
public class RetryServiceImpl implements RetryService {
    @Override
    @Retryable(value = Exception.class,maxAttempts = 5,backoff = 
    @Backoff(delay = 5000l,multiplier = 1))
    public int demo(int number) throws Exception{
        System.out.println("test被调用");
          if (number==0){
              throw new Exception("抛异常了!");
          }
        System.out.println("test被调用,完成!");
 
        return ResponEntity.success();
    }
}

参数说明

value:抛出指定异常才会重试 include:和value一样,默认为空,当exclude也为空时,默认所有异常 exclude:指定不处理的异常 maxAttempts:最大重试次数,默认3次

@Backoff注解 delay:指定延迟后重试 multiplier:指定延迟的倍数,比如delay=5000l,multiplier=2时,第一次重试为5秒后,第二次为10秒,第三次为20秒

@Recover 当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调

@Recover注意事项

方法的返回值必须与@Retryable方法一致 方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的) 该回调方法与重试方法写在同一个实现类里面

测试
代码语言:javascript复制
@SpringBootApplication
@EnableRetry
public class Application {
  public static void main(String[] args) throws Exception {
    ApplicationContext annotationContext = new AnnotationConfigApplicationContext("hello");
    RemoteService remoteService = annotationContext.getBean("retryService ", RetryService.class);
    retryService.demo();
  }
}

0 人点赞