用JDK8的函数式接口实现简单的重试机制

用JDK8的函数式接口实现简单的重试机制

 

重试机制的使用场景

在任何系统中,任何组件都有一定的概率出错,在代码中就不得不考虑应对这些出错场景,提高代码的健壮性和业务的稳定性。而重试就是一种非常普通的容错机制,在出现问题的时候,以一定的频率、一定的次数重试几次,可提高系统的容错能力。

本文就用JDK8的函数式接口来实现一个非常简单的重试框架。

代码实现

  • MyRetry.java:
package com.function.functionalinterface;

import java.util.concurrent.TimeUnit;

/**
 * 重试函数式接口
 *
 */
@FunctionalInterface
public interface MyRetry {
    /**
     * 执行某种操作的函数结构定义,没有入参,返回值为布尔类型
     * @return
     */
    boolean action();

    /**
     * 最大重试次数5次
     */
    public static final int MAX_RETRY_COUNT_5 = 5;

    /**
     * 重试间隔时间3秒
     */
    public static final int INTERVAL_SECONDS_3 = 3;

    /**
     * 实现重试
     * 
     * @param maxRetryCount
     *            最大重试次数
     * @param workFunction
     *            每次重试所执行的工作函数
     * @param intervalFunctin
     *            重试间隔期间执行的函数,比如sleep一段时间
     */
    public static void retry(int maxRetryCount, MyRetry workFunction,
            MyRetry intervalFunctin) {
        // 如果最大重试次数小于1,或重试工作函数为空,直接返回
        if (maxRetryCount < 1 || null == workFunction) {
            return;
        }

        // 执行最大重试次数次重试操作
        for (int i = 0; i < maxRetryCount; i++) {
            // 如果本次的执行结果为成功,则不再继续重试
            if (workFunction.action()) {
                return;
            }

            // 如果本次的执行结果为失败,则执行重试间隔函数之后继续重试执行工作函数
            intervalFunctin.action();
        }

        System.out.println("have tried maxRetryCount!");
    }

    /**
     * 让当前线程睡眠指定秒数
     * 
     * @param seconds
     * @return
     */
    public static boolean doSleep(int seconds) {
        try {
            TimeUnit.SECONDS.sleep(seconds);
            return true;
        } catch (InterruptedException e) {
            System.out.println("exception occurs when doSleep, e = " + e);
            return false;
        }
    }
}

  • MyRetryTest.java:
package com.function.functionalinterface;

/**
 * 测试重试函数式接口
 *
 */
public class MyRetryTest {

    public static void main(String[] args) {
        // 工作函数入参
        boolean param = true;
        MyRetry.retry(MyRetry.MAX_RETRY_COUNT_5, () -> doWork(param),
                () -> MyRetry.doSleep(MyRetry.INTERVAL_SECONDS_3));
    }

    /**
     * 工作函数
     * 
     * @param param
     *            一个布尔类型的入参
     * @return
     */
    public static boolean doWork(boolean param) {
        System.out.println("start to do some work...");

        // 为简单期间,将入参param的值取反,模拟工作函数的执行结果
        boolean result = !param;
        if (result) {
            System.out.println("doWork success!");
        } else {
            System.out.println("doWork failed!");
        }

        return result;
    }

}

  • 运行MyRetryTest.java,输出结果如下:
start to do some work...
doWork failed!
start to do some work...
doWork failed!
start to do some work...
doWork failed!
start to do some work...
doWork failed!
start to do some work...
doWork failed!
have tried maxRetryCount!

可见上述代码每隔3秒重试一次,一共重试了5次。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值