美文网首页Java
Java 8 实现一个简单的错误重试工具类

Java 8 实现一个简单的错误重试工具类

作者: hdfg159 | 来源:发表于2020-08-04 23:53 被阅读0次

    Java 8 实现一个简单的错误重试工具类

    首先实现这个工具类还是需要熟悉一下Java 8的函数式编程或者对匿名内部类的实现方式

    这个工具类的实现非常的简单,现在直接上代码:

    import java.util.List;
    import java.util.function.Consumer;
    import java.util.function.Supplier;
    
    /**
     * 错误重试工具类
     *
     * @author hdfg159
     * @date 2020/8/4 23:27
     */
    public abstract class RetryUtils {
        /**
         * 重试调度方法
         *
         * @param dataSupplier
         *      返回数据方法执行体
         * @param exceptionCaught
         *      出错异常处理(包括第一次执行和重试错误)
         * @param retryCount
         *      重试次数
         * @param sleepTime
         *      重试间隔睡眠时间(注意:阻塞当前线程)
         * @param expectExceptions
         *      期待异常(抛出符合相应异常时候重试),空或者空容器默认进行重试
         * @param <R>
         *      数据类型
         *
         * @return R
         */
        public static <R> R invoke(Supplier<R> dataSupplier, Consumer<Throwable> exceptionCaught, int retryCount, long sleepTime, List<Class<? extends Throwable>> expectExceptions) {
            Throwable ex;
            try {
                // 产生数据
                return dataSupplier.get();
            } catch (Throwable throwable) {
                // 捕获异常
                catchException(exceptionCaught, throwable);
                ex = throwable;
            }
    
            if (expectExceptions != null && !expectExceptions.isEmpty()) {
                // 校验异常是否匹配期待异常
                Class<? extends Throwable> exClass = ex.getClass();
                boolean match = expectExceptions.stream().anyMatch(clazz -> clazz == exClass);
                if (!match) {
                    return null;
                }
            }
    
            // 匹配期待异常或者允许任何异常重试
            for (int i = 0; i < retryCount; i++) {
                try {
                    if (sleepTime > 0) {
                        Thread.sleep(sleepTime);
                    }
                    return dataSupplier.get();
                } catch (InterruptedException e) {
                    System.err.println("thread interrupted !! break retry,cause:" + e.getMessage());
                    // 恢复中断信号
                    Thread.currentThread().interrupt();
                    // 线程中断直接退出重试
                    break;
                } catch (Throwable throwable) {
                    catchException(exceptionCaught, throwable);
                }
            }
    
            return null;
        }
    
        private static void catchException(Consumer<Throwable> exceptionCaught, Throwable throwable) {
            try {
                exceptionCaught.accept(throwable);
            } catch (Throwable e) {
                System.err.println("retry exception caught throw exception:" + e.getMessage());
            }
        }
    }
    

    附上一个简单的测试用例和用法:

    import java.util.ArrayList;
    
    public class Test {
        public static void main(String[] args) {
            String error = RetryUtils.invoke(() -> {
                // 返回数据的代码编写
                // return "test";
                throw new RuntimeException("error");
            }, throwable -> System.out.println("error"), 3, 5_000, new ArrayList<>());
            // 输出返回数据
            System.out.println(error);
        }
    }
    

    相关文章

      网友评论

        本文标题:Java 8 实现一个简单的错误重试工具类

        本文链接:https://www.haomeiwen.com/subject/alggrktx.html