方法重试工具类
- 使用了java8新特性-函数式编程Supplier<R>和Predicate<R>
import lombok.extern.slf4j.Slf4j;
import java.util.function.Predicate;
import java.util.function.Supplier;
@Slf4j
public class RetryUtil {
private static final int DEFAULT_RETRY_COUNT = 60;
private static final long DEFAULT_INTERVAL_TIME = 60000L;
public static <R> R nullRetry(Supplier<R> s) {
return nullRetry(DEFAULT_RETRY_COUNT, DEFAULT_INTERVAL_TIME, s);
}
public static <R> R nullRetry(int retryCount, long intervalTime, Supplier<R> s) {
return predictRetry(retryCount, intervalTime, s, r -> r == null);
}
public static <R> R predictRetry(Supplier<R> s, Predicate<R> predicate) {
return predictRetry(DEFAULT_RETRY_COUNT, DEFAULT_INTERVAL_TIME, s, predicate);
}
public static <R> R predictRetry(int retryCount, long intervalTime, Supplier<R> s, Predicate<R> predicate) {
R r = null;
Predicate exceptionP = t -> Boolean.FALSE;
try {
r = s.get();
} catch (Exception e) {
exceptionP = t -> Boolean.TRUE;
log.error(LogFormatter.toLog(CommonErrorCode.ERROR, "tips"), "get result is error ", e);
}
if (predicate.or(exceptionP).test(r) && retryCount > 0) {
try {
Thread.sleep(intervalTime);
} catch (InterruptedException e) {
log.error(LogFormatter.toLog(CommonErrorCode.ERROR, "tips"), "retry unit sleep interrupted ", e);
}
retryCount--;
log.warn(LogFormatter.toLog(CommonErrorCode.ERROR, "tips", "retry count left"), "get result predict false then retry", retryCount + 1);
return predictRetry(retryCount, intervalTime, s, predicate);
}
return r;
}
}