spring-retry重试支持

什么时候需要重处理?

在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败,调用远程服务失败,争抢锁失败,等等,这些错误可能是因为网络波动造成的,等待过后重处理就能成功.通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码.然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能.

思路

使用@Retryable和@Recover实现重处理,以及重处理失后的回调

1.pom引用

<dependency>
 <groupId>org.springframework.retry</groupId>
 <artifactId>spring-retry</artifactId>
</dependency>

2.应用启动类开启retry

@EnableRetry
public class BaseApplication {
  .......
}

3.在指定方法上标记@Retryable来开启重试

@Retryable(value={A异常.class,B异常.class},
      maxAttempts=重试次数,
      backoff = @Backoff(value = 每次重试延迟毫秒数))
public Integer retry() {
 LOGGER.info("测试retry");
 final int a = 5;
 int num = new SecureRandom().nextInt();
 if (num % a == 0) {
  return num;
 }
 throw new RetryException("重试失败");
}

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

@Recover
public void recover(A异常 e) {
 // ... do something
}

@Recover
public void recover(B异常 e) {
 // ... do something
}

@EnableRetry能否重试。当proxyTargetClass属性为true时,使用CGLIB代理。默认使用标准JAVA注解。在spring Boot中此参数写在程序入口即可。
@Retryable 标注此注解的方法在发生异常时会进行重试
value:指定处理的异常类

        include:指定处理的异常类和value一样,默认为空,当exclude也为空时,默认所有异常

        exclude:指定异常不处理,默认空,当include也为空时,默认所有异常

        maxAttempts:最大重试次数。默认3次

        backoff: 重试等待策略。默认使用@Backoff注解

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

       不设置参数时,默认使用FixedBackOffPolicy(指定等待时间),重试等待1000ms
       设置delay,使用FixedBackOffPolicy(指定等待时间),重试等待填写的时间
       设置delay和maxDealy时,重试等待在这两个值之间均态分布
       设置delay、maxDealy、multiplier,使用 ExponentialBackOffPolicy(指数级重试间隔的实现 ),multiplier即指定延迟倍数,比如delay=5000l,multiplier=2,则第一次重试为5秒,第二次为10秒,第三次为20秒……

@Recover 用于@Retryable重试失败后处理方法,此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。

例子:

    @Retryable(value= {BusinessException.class},maxAttempts = 3,backoff = @Backoff(delay = 5000l,multiplier = 2))  
    public void call() throws Exception {  
        logger.info("do something...");  
        throw new BusinessException("RPC调用异常");  
    }  
    @Recover  
    public void recover(BusinessException e) {  
        logger.info(" ---------------------------  ");  
        logger.info(e.getMessage());  
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值