/** * Cancels this and the internal delegate. */ @Override public synchronized boolean cancel(boolean mayInterruptIfRunning) { if (isDone()) return false; boolean cancelResult = super.cancel(mayInterruptIfRunning); if (delegate != null) cancelResult = delegate.cancel(mayInterruptIfRunning); Throwable failure = new CancellationException(); complete(null, failure); executor.handleComplete(ExecutionResult.failure(failure), execution); return cancelResult; }
@Override protected Supplier<ExecutionResult> supply(Supplier<ExecutionResult> supplier) { return () -> { while (true) { ExecutionResult result = supplier.get(); if (retriesExceeded) return result; result = postExecute(result); if (result.isComplete()) return result; try { Thread.sleep(TimeUnit.NANOSECONDS.toMillis(result.getWaitNanos())); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return ExecutionResult.failure(new FailsafeException(e)); } // Call retry listener if (retryListener != null) retryListener.handle(result, execution); } }; }
@Override protected ExecutionResult preExecute() { if (policy.allowsExecution()) { policy.preExecute(); return null; } return ExecutionResult.failure(new CircuitBreakerOpenException()); }
static <T> Supplier<ExecutionResult> resultSupplierOf(CheckedSupplier<T> supplier, AbstractExecution execution) { return () -> { ExecutionResult result = null; try { result = ExecutionResult.success(supplier.get()); } catch (Throwable t) { result = ExecutionResult.failure(t); } finally { execution.record(result); } return result; }; }
static <T> Supplier<CompletableFuture<ExecutionResult>> promiseOfStage( CheckedSupplier<? extends CompletionStage<? extends T>> supplier, AbstractExecution execution) { Assert.notNull(supplier, "supplier"); return () -> { CompletableFuture<ExecutionResult> promise = new CompletableFuture<>(); try { execution.preExecute(); supplier.get().whenComplete((innerResult, failure) -> { // Unwrap CompletionException cause ExecutionResult result; if ( failure != null ) { if ( failure instanceof CompletionException) { failure = failure.getCause(); } result = ExecutionResult.failure(failure); } else { result = ExecutionResult.success(innerResult); } execution.record(result); promise.complete(result); }); } catch (Throwable e) { ExecutionResult result = ExecutionResult.failure(e); execution.record(result); promise.complete(result); } return promise; }; }
static <T> Supplier<CompletableFuture<ExecutionResult>> promiseOfStage( ContextualSupplier<? extends CompletionStage<? extends T>> supplier, AbstractExecution execution) { Assert.notNull(supplier, "supplier"); return () -> { CompletableFuture<ExecutionResult> promise = new CompletableFuture<>(); try { execution.preExecute(); supplier.get(execution).whenComplete((innerResult, failure) -> { // Unwrap CompletionException cause ExecutionResult result; if ( failure != null ) { if ( failure instanceof CompletionException) { failure = failure.getCause(); } result = ExecutionResult.failure(failure); } else { result = ExecutionResult.success(innerResult); } execution.record(result); promise.complete(result); }); } catch (Throwable e) { ExecutionResult result = ExecutionResult.failure(e); execution.record(result); promise.complete(result); } return promise; }; }
static Supplier<CompletableFuture<ExecutionResult>> promiseOf(CheckedRunnable runnable, AbstractExecution execution) { Assert.notNull(runnable, "runnable"); return () -> { ExecutionResult result; try { execution.preExecute(); runnable.run(); result = ExecutionResult.NONE; } catch (Throwable e) { result = ExecutionResult.failure(e); } execution.record(result); return CompletableFuture.completedFuture(result); }; }
static Supplier<CompletableFuture<ExecutionResult>> promiseOf(ContextualRunnable runnable, AbstractExecution execution) { Assert.notNull(runnable, "runnable"); return () -> { ExecutionResult result; try { execution.preExecute(); runnable.run(execution); result = ExecutionResult.NONE; } catch (Throwable e) { result = ExecutionResult.failure(e); } execution.record(result); return CompletableFuture.completedFuture(result); }; }
static <T> Supplier<CompletableFuture<ExecutionResult>> promiseOf(ContextualSupplier<T> supplier, AbstractExecution execution) { Assert.notNull(supplier, "supplier"); return () -> { ExecutionResult result; try { execution.preExecute(); result = ExecutionResult.success(supplier.get(execution)); } catch (Throwable e) { result = ExecutionResult.failure(e); } execution.record(result); return CompletableFuture.completedFuture(result); }; }
static <T> Supplier<CompletableFuture<ExecutionResult>> promiseOf(CheckedSupplier<T> supplier, AbstractExecution execution) { Assert.notNull(supplier, "supplier"); return () -> { ExecutionResult result; try { execution.preExecute(); result = ExecutionResult.success(supplier.get()); } catch (Throwable e) { result = ExecutionResult.failure(e); } execution.record(result); return CompletableFuture.completedFuture(result); }; }
@Override @SuppressWarnings("unchecked") protected ExecutionResult onFailure(ExecutionResult result) { try { return result.withResult(policy.apply(result.getResult(), result.getFailure(), execution.copy())); } catch (Exception e) { return ExecutionResult.failure(e); } }