基于@Retryable注解的spring重试机制

当有些方法调用因为网络原因调用失败时往往需要重试机制。

1.通过while循环或者捕获异常后做处理。

2.使用spring提供的重试机制,这种方式的好处是基于AOP实现,没有代码入侵。

基于springBoot项目使用@Retryable注解实现重试

1.添加依赖

 
            org.springframework.retry
            spring-retry
        

2.在启动类或者配置类上加@EnableRetry注解,启用这个功能

@EnableRetry
public class TestApplication {

	public static void main(String[] args) {
		try {
			SpringApplication.run(TestApplication.class, args);
			log.info("[启动成功]");
		}catch (Exception e){
			log.info("[启动失败]:{}",e);
		}

	}

}

3.创建一个类,在需要重试的方法上添加注解@Retryable
maxAttempts:尝试次数 默认是3次
backoff:可以指定暂停时间
value:当出现这种异常时,进行重试

    @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public void cacheProduct(String productCode) throws Exception {
       

    }



    //重试指定次数仍然失败后 统一由同一个类中的@Recover注解的方法做处理(类似于全局异常处理的方式)
    @Recover
    public int recover(Exception e) {
        logger.warn("减库存失败!!!" + LocalTime.now());
        //记日志到数据库
        return totalNum;
    }

 

 @Retryable注解使用需要注意的地方:

1.由于是基于AOP实现,所以不支持类里自调用方法

2.方法所在的类不能是接口的实现类

3.如果重试失败需要给@Recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void

4.方法内不能使用try catch,只能往外抛异常

 

 

 

 

你可能感兴趣的:(SpringBoot)