package com.github.shansun.sparrow.retryer;
import java.util.concurrent.TimeUnit;
/**
* 重试执行任务,真正的重试处理逻辑
*
* @author lanbo <br>
* @version 1.0 <br>
* @date 2012-8-28
*/
public class RetryableTask<T> implements Retryable<T> {
private final Retryable<T> retryable;
private long left;
private Retryer retryer;
public RetryableTask(Retryable<T> retryable, Retryer retryer) {
this.retryable = retryable;
this.retryer = retryer;
this.left = retryer.getTimes();
}
@Override
public T execute() throws Throwable {
try {
T returnObject = retryable.execute();
if (!exhausted() && retryer.getReturnCondition().apply(returnObject)) {
return retry();
}
return returnObject;
} catch (Throwable e) {
if (!exhausted() && retryer.getThrowCondition().apply(e)) {
return retry();
}
throw e;
}
}
private T retry() throws Throwable {
// 只有超过10ms的才真正去睡眠等待
if (retryer.getInterval() > 10) {
TimeUnit.MILLISECONDS.sleep(retryer.getInterval());
}
left--;
return execute();
}
private boolean exhausted() {
return left == 0;
}
}