Java重试模块抽象

/**
 *
 * @author claireliu
 * @date 2017/12/20
 */
public interface RetryProcessor<T> {

    T process() throws TimeoutException;

}
/**
 *
 * @author claireliu
 * @date 2017/12/20
 */
public class SomeRetryTemplate {

    int TRY_TIMES = 3;

    public <T> T process(RetryProcessor<T> processor) throws TimeoutException{
        int time = 1;

        TimeoutException exp = null;

        while (time <=  TRY_TIMES) {
            try{
                return processor.process();
            }catch (TimeoutException e) {
                exp = e;
                time = handleExp(time, e);
            }
        }

        throwExpAfterMoreThanMaxTryTimes(time, exp);
        return null;
    }

    /**
     * 处理exception的情况。
     */
    private int handleExp(int time, TimeoutException exp) throws TimeoutException {
        // 如果e满足某些条件,则进行重试机制;
        if(isNeedToRetry(exp)) {
            // 先休眠1s钟;
            goToSleepOneSeconds();
            // time 自增
            time++;
        }else {
            // 向上抛出异常,跳出重试;
            throw exp;
        }
        return time;
    }

    /**
     * 当超过TRY_TIMES也退出。
     */
    private void throwExpAfterMoreThanMaxTryTimes(int time, TimeoutException exp) throws TimeoutException {
        if(time > TRY_TIMES) {
            throw exp;
        }
    }

    private void goToSleepOneSeconds() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private boolean isNeedToRetry(TimeoutException exp) {
        // 自己的判断。
        return false;
    }

}
/**
 *
 * @author claireliu
 * @date 2017/12/20
 */
public class RetryMain {

    public static void main(String[] args) throws TimeoutException {
        SomeRetryTemplate template = new SomeRetryTemplate();

        template.process(new RetryProcessor<Boolean>() {
            @Override
            public Boolean process() throws TimeoutException {
                return doSomeBusinessAction();
            }
        });
    }

    private static Boolean doSomeBusinessAction() throws TimeoutException {
        throw new TimeoutException();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值