/** * Retry {@code code} up to {@code retries} times. */ public <T> ListenableFuture<T> retry(final Supplier<ListenableFuture<T>> code, final int retries, final long delay, final TimeUnit timeUnit, final Predicate<T> retryCondition) { SettableFuture<T> future = SettableFuture.create(); startRetry(future, code, retries, delay, timeUnit, retryCondition); return future; }
private <T> void handleFailure(final SettableFuture<T> future, final Supplier<ListenableFuture<T>> code, final int retries, final long delay, final TimeUnit timeUnit, final Predicate<T> retryCondition, Throwable t) { if (retries > 0) { executorService.schedule( () -> startRetry(future, code, retries - 1, delay, timeUnit, retryCondition), delay, timeUnit); } else { future.setException(t); } } }