private void callSuccessListener(ExecutionResult result) { if (result.isComplete() && policy instanceof FailurePolicy) { FailurePolicy failurePolicy = (FailurePolicy) policy; if (failurePolicy.successListener != null) failurePolicy.successListener.handle(result, execution); } }
private void callFailureListener(ExecutionResult result) { if (result.isComplete() && policy instanceof FailurePolicy) { FailurePolicy failurePolicy = (FailurePolicy) policy; if (failurePolicy.failureListener != null) failurePolicy.failureListener.handle(result, execution); } } }
/** * Performs a synchronous execution. */ ExecutionResult executeSync(Supplier<ExecutionResult> supplier) { for (PolicyExecutor<Policy<Object>> policyExecutor : policyExecutors) supplier = policyExecutor.supply(supplier); ExecutionResult result = supplier.get(); completed = result.isComplete(); executor.handleComplete(result, this); return result; } }
@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); } }; }
/** * Performs post-execution handling of the {@code result}, returning true if complete else false. * * @throws IllegalStateException if the execution is already complete */ synchronized boolean postExecute(ExecutionResult result) { record(result); for (PolicyExecutor<Policy<Object>> policyExecutor : policyExecutors) result = policyExecutor.postExecute(result); waitNanos = result.getWaitNanos(); completed = result.isComplete(); return completed; }