import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.TimeUnit;
/**
* @title:RetryUtil重试执行工具类
* @author:liuxing
* @date:2015-07-08 01:55
*/
public class RetryUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(RetryUtil.class);
public interface ExecuteFunction {
void execute() throws Exception;
}
/**
* 重试执行
* @param retryCount
* @param interval
* @param timeUnit
* @param throwIfFail
* @param function
* @throws Exception
*/
public static void retry(int retryCount, long interval, TimeUnit timeUnit, boolean throwIfFail, ExecuteFunction function) throws Exception {
if (function == null) {
return;
}
for (int i = 0; i < retryCount; i++) {
try {
function.execute();
break;
} catch (Exception e) {
if (i == retryCount - 1) {
if (throwIfFail) {
throw e;
} else {
break;
}
} else {
if (timeUnit != null && interval > 0L) {
try {
timeUnit.sleep(interval);
} catch (InterruptedException e1) {
LOGGER.error(e1.getMessage(), e1);
}
}
}
}
}
}
/**
* 有间隔的重试
* @param retryCount
* @param interval
* @param timeUnit
* @param handler
* @throws Exception
*/
public static void retry(int retryCount, long interval, TimeUnit timeUnit, ExecuteFunction handler) throws Exception {
retry(retryCount, interval, timeUnit, false, handler);
}
/**
* 不间隔重试
* @param retryCount
* @param function
* @throws Exception
*/
public static void retry(int retryCount, ExecuteFunction function) throws Exception {
retry(retryCount, -1, null, function);
}
}
转载于:https://my.oschina.net/haokevin/blog/2878725