用JDK8的函数式接口实现重试机制
最近重新学习函数式接口,开发一个重试接口
/**
* 重试机制
*
* @param retryTimes 重试次数
* @param sleepTime 重试暂停时间
* @param fun 主处理方法
* @param funError 当发生异常时的处理方法
* @param funErrorMaxRetry 当重试达到最大值时仍然失败时的处理方法
* @param funFinally Finally内执行的方法
* @param isThrowExceptionOnMaxRetry 当达到最大重试次数时是否抛出异常
* @return 是否成功
*/
public static boolean doRetry(int retryTimes, int sleepTime, Consumer<Object> fun, Consumer<Exception> funError, Consumer<Exception> funErrorMaxRetry, Consumer<Object> funFinally, boolean isThrowExceptionOnMaxRetry) {
if (null == fun) {
return false;
}
for (int i = 0; i < retryTimes; i++) {
try {
//调用主处理委托
fun.accept(new Object());
return true;
} catch (Exception ex) {
// 调用异常委托
if (null != funError) {
funError.accept(ex);
}
// 当达到重试最大次数
if (i == retryTimes - 1) {
// 执行达到最大次数后调用重试失败的委托
if (null != funErrorMaxRetry) {
funErrorMaxRetry.accept(ex);
}
// 当达到最大重试次数时抛出异常
if (isThrowExceptionOnMaxRetry) {
throw ex;
}
} else {
// 线程暂停
if (sleepTime > 0) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// 会产生大量字符串,除了刷新控制台无意义
// e.printStackTrace();
}
}
}
} finally {
if (null != funFinally) {
// 调用结束执行委托
funFinally.accept(new Object());
}
}
}
return false;
}