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);
}
}
网友评论