实现界面:
RetryUtils.retryQuietly(3, () -> { redisClient.set(key, value, time); return true; });
以下为重试的工具,供参考学习:
import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.github.rholder.retry.WaitStrategies;
import com.google.common.base.Predicates;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
public class RetryUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(RetryUtils.class);
private static Integer a = 0;
public static <T> T retryQuietly(Integer times, Callable<T> callable) {
try {
return retry(times, callable);
} catch (Exception e) {
LOGGER.error("Call method error", e);
return null;
}
}
/**
* 重试并返回是否成功
* @param times 次数
* @param callable 重试方法
* @param sleepSeconds 重试间隔
* @return
* @throws Exception
*/
public static Boolean retry(Integer times, Callable<Boolean> callable, Integer sleepSeconds) throws Exception {
int realTimes = times == null ? 1 : times;
Retryer<Boolean> retryer =
RetryerBuilder.<Boolean>newBuilder()
.withWaitStrategy(WaitStrategies.fixedWait(sleepSeconds, TimeUnit.SECONDS))
.withStopStrategy(StopStrategies.stopAfterAttempt(realTimes))
.retryIfException()
.retryIfResult(Predicates.equalTo(false))
.build();
return retryer.call(callable);
}
public static <T> T retry(Integer times, Callable<T> callable) throws Exception {
int realTimes = times == null ? 1 : times;
Retryer<T> retryer =
RetryerBuilder.<T>newBuilder().retryIfException().withStopStrategy(StopStrategies.stopAfterAttempt(realTimes)).build();
return retryer.call(callable);
}
public static <T> T retryQuietly(Integer times, T result, Callable<T> callable) {
try {
return retry(times, result, callable);
} catch (Exception e) {
LOGGER.error("Call method error", e);
return null;
}
}
public static <T> T retry(Integer times, T result, Callable<T> callable) throws Exception {
int realTimes = times == null ? 1 : times;
Retryer<T> retryer =
RetryerBuilder.<T>newBuilder().retryIfException().withStopStrategy(StopStrategies.stopAfterAttempt(realTimes))
.retryIfResult(t -> Objects.equals(t, result)).build();
return retryer.call(callable);
}
public static void main(String[] args) {
RetryUtils.retryQuietly(3, () -> {
a++;
throw new RuntimeException();
});
System.out.println(a);
}
}