springretry重试

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值