优雅的系统重试

进入正题之前,先引入这样一个场景:

最近,程序员A接到这样一个业务需求:需要对接多个第三方接口且第三方接口可能会失败,需要发起重试,并且支持最大重试次数,成功后续重试次数不执行,超过重试次数进行状态检查,检查不通过需要抛出异常。

接到这个需求,A同学开动小脑筋,马上就想到了解决策略,说干就干,A同学的代码结构如下:

/**最大执行次数*/
    final Integer MAX_TIEMS=3;
    /**成功状态*/
    static final String STATUS_SUCCESS="200";
    /**异常状态*/
    static final String STATUS_FAIL="500";
    
    public void methodA(){
        Boolean flag=Boolean.FALSE;
        for (Integer i = 0; i < MAX_TIEMS; i++) {
            String status = businessHandle();
            if(STATUS_SUCCESS.equals(status)){
                flag=true;
                break;
            }
        }
        if (flag){
            throw new RuntimeException("方法执行失败");
        }
    }

    /**业务逻辑处理*/
    public String businessHandle(){
        return null;
    }

其他接口的重试代码也大致是这样,A同学是一个有代码洁癖的程序员,重复的代码高频出现,肯是不能忍受的。于是,A同学马上对代码进行了重新梳理,梳理结果如下:

1.几个接口里面都需要包含重试的功能,且重试的框架是固定的,这部分是不是可以抽象出来。

2.方法里面执行的业务逻辑不固定且业务参数不固定,这部分是否可以直接用lambda表达式来进行处理。

 说干就干,A同学马上就完成了代码的重构操作,代码结构大致如下:


/**服务类*/
public class BusinessService {

    public void methodA(){
        RetryStrategy retryStrategy = new RetryStrategy();
        //重试
        retryStrategy.retry(this::businessHandle);
    }

    /**业务逻辑处理*/
    public String businessHandle(){
        return null;
    }
}

/**重试策略*/
public class RetryStrategy {
    
    /**最大执行次数*/
    final Integer MAX_TIEMS=3;

    /**成功状态*/
    static final String STATUS_SUCCESS="200";

    /**异常状态*/
    static final String STATUS_FAIL="500";

    /**业务重试*/
    public void retry(Supplier<String> supplier){
        Boolean flag=Boolean.FALSE;
        for (Integer i = 0; i < MAX_TIEMS; i++) {
            String status = supplier.get();
            if(STATUS_SUCCESS.equals(status)){
                flag=true;
                break;
            }
        }
        if (flag){
            throw new RuntimeException("方法执行失败");
        }
    }

}

 你们在项目中,使用什么优雅的方式来进行方法重试呢,欢迎评论区评论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值