SpringRetry(spring的重试机制)——只需一个注解

1、什么是spring的重试机制:

SpringRetry(spring的自动重试机制),SpringRetry是基于AOP实现的,在应用程序中,由于一些网络等不可预知的问题,我们的程序或者接口会失败,比如调用一个第三方的接口获取数据失败了,这时就需要重试机制,比如延时3S后重试、间隔不断增加重试等。都可以使用SpringRetry来实现。

2、 如何使用SpringRetry

SpringRetry的使用相当简单,只需要导包+注解便可以搞定

①导入SpringRetry依赖


    org.springframework
    spring-aspects

②在主启动类或者需要重试的方法所在的类上添加注解@EnableRetry

@EnableRetry
public class Test { ... }

③在所需要重试的方法上加上一下注解

 @Retryable(value = Exception.class, maxAttempts = 10, backoff = @Backoff(delay = 200L, multiplier = 1))
    private Map<String, Object> postSendRequest(String httpUrl, Map<String, Object> resultMap, String resultStr)
        throws Exception {
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        restTemplate.postForObject(httpUrl, resultStr, String.class);
        resultMap.put("result", "成功!");
        return resultMap;
    }

注意:

@Retryable注解参数说明:
  • maxAttempts :最大重试次数,默认为3,如果要设置的重试次数为3,可以不写;
  • value:抛出指定异常才会重试
  • include:和value一样,默认为空,当exclude也为空时,默认所以异常
  • exclude:指定不处理的异常
  • backoff:重试等待策略,默认使用@Backoff@Backoff的value默认为1000L,我们设置为200L。
@Backoff注解中的参数说明:
  • value:隔多少毫秒后重试,默认为1000L;
  • delay:和value一样,但是默认为0;
  • multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。

④可以同时在同一个类中使用@Recover来处理N次处理后都没有成功后需要处理的事情

可以在指定方法上标记@Recover来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中)

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

3、示例

@EnableRetry//也可以在主启动类上
public class RecoryTest {
    
    @Retryable(value = {RetryException.class},  // 指定发生的异常进行重试
            maxAttempts=3,                      // 重试次数, 默认即为3
            backoff = @Backoff(delay = 2000L, multiplier = 2)) // 每次重试延迟毫秒数 及 延迟倍数
    @Async
    public void retry() {
        log.info("重试");
        throw new RetryException("失败");
    }
 
    @Recover
    public void recover (RetryException e) {
        log.error("失败",e.getMessage());
    }
}

当重试后还是失败就会回调recover()函数;

注意

1、在使用中,被重试的方法不要捕获异常,但是需要将异常抛出。

2、避免在同类中调用retry()方法,解其实是通过动态代理的方式来实现异步调用的。同理@Transactional、@Async注解也是,同类之间调用不生效

你可能感兴趣的:(spring,java,后端)