@Override public <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest) { final CompletableFuture<T> result = new CompletableFuture<>(); final CompletionStage<T> prevResult = super.execute(sphereRequest); CompletableFutureUtils.transferResult(prevResult, result); scheduler.schedule(() -> result.completeExceptionally(new SphereTimeoutException(new TimeoutException())), delay, timeUnit); return result; }
@Override public <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest) { final CompletableFuture<T> result = new CompletableFuture<>(); final CompletionStage<T> prevResult = super.execute(sphereRequest); CompletableFutureUtils.transferResult(prevResult, result); scheduler.schedule(() -> result.completeExceptionally(new SphereTimeoutException(new TimeoutException())), delay, timeUnit); return result; }
@Override public <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest) { final CompletableFuture<T> result = new CompletableFuture<>(); final CompletionStage<T> prevResult = super.execute(sphereRequest); CompletableFutureUtils.transferResult(prevResult, result); scheduler.schedule(() -> result.completeExceptionally(new SphereTimeoutException(new TimeoutException())), delay, timeUnit); return result; }
@Override public <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest) { final CompletableFuture<T> promiseForTheClient = new CompletableFuture<>(); final AsyncTask asyncTask = new AsyncTask(() -> { final CompletionStage<T> realFuture = super.execute(sphereRequest); CompletableFutureUtils.transferResult(realFuture, promiseForTheClient); CompletableFuture<String> forHandlerFuture = new CompletableFuture<>(); realFuture.whenComplete((v, e) -> forHandlerFuture.complete("done")); return forHandlerFuture; }); actor.tell(asyncTask); return promiseForTheClient; }
@Override public <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest) { final CompletableFuture<T> promiseForTheClient = new CompletableFuture<>(); final AsyncTask asyncTask = new AsyncTask(() -> { final CompletionStage<T> realFuture = super.execute(sphereRequest); CompletableFutureUtils.transferResult(realFuture, promiseForTheClient); CompletableFuture<String> forHandlerFuture = new CompletableFuture<>(); realFuture.whenComplete((v, e) -> forHandlerFuture.complete("done")); return forHandlerFuture; }); actor.tell(asyncTask); return promiseForTheClient; }
@Override public <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest) { final CompletableFuture<T> promiseForTheClient = new CompletableFuture<>(); final AsyncTask asyncTask = new AsyncTask(() -> { final CompletionStage<T> realFuture = super.execute(sphereRequest); CompletableFutureUtils.transferResult(realFuture, promiseForTheClient); CompletableFuture<String> forHandlerFuture = new CompletableFuture<>(); realFuture.whenComplete((v, e) -> forHandlerFuture.complete("done")); return forHandlerFuture; }); actor.tell(asyncTask); return promiseForTheClient; }
@Test public void testTransferResultSuccessful() throws Exception { final CompletableFuture<String> future = new CompletableFuture<>(); transferResult(successful("hello"), future); assertThat(future.join()).isEqualTo("hello"); }
private <T> CompletableFuture<T> executeWithRecover(final SphereRequest<T> sphereRequest, final HttpRequest httpRequest, final int ttl) { final CompletionStage<T> intermediateResult = httpClient.execute(httpRequest).thenApplyAsync(httpResponse -> { try { return processHttpResponse(sphereRequest, objectMapper, config, httpResponse, httpRequest); } catch (final SphereException e) { fillExceptionWithData(sphereRequest, httpResponse, e, config, httpRequest); throw e; } }); final CompletableFuture<T> result = new CompletableFuture<T>(); intermediateResult.whenCompleteAsync((value, throwable) -> { if (throwable != null) { if (throwable.getCause() instanceof InvalidTokenException && ttl > 0 && tokenSupplier instanceof RefreshableSphereAccessTokenSupplier) { final RefreshableSphereAccessTokenSupplier supplier = (RefreshableSphereAccessTokenSupplier) tokenSupplier; final CompletionStage<T> nextAttemptCompletionStage = supplier.getNewToken().thenComposeAsync(token -> execute(sphereRequest, token, ttl - 1)); CompletableFutureUtils.transferResult(nextAttemptCompletionStage, result); } else { result.completeExceptionally(throwable); } } else { result.complete(value); } }); return result; }
private <T> CompletableFuture<T> executeWithRecover(final SphereRequest<T> sphereRequest, final HttpRequest httpRequest, final int ttl) { final CompletionStage<T> intermediateResult = httpClient.execute(httpRequest).thenApplyAsync(httpResponse -> { try { return processHttpResponse(sphereRequest, objectMapper, config, httpResponse, httpRequest); } catch (final SphereException e) { fillExceptionWithData(sphereRequest, httpResponse, e, config, httpRequest); throw e; } }); final CompletableFuture<T> result = new CompletableFuture<T>(); intermediateResult.whenCompleteAsync((value, throwable) -> { if (throwable != null) { if (throwable.getCause() instanceof InvalidTokenException && ttl > 0 && tokenSupplier instanceof RefreshableSphereAccessTokenSupplier) { final RefreshableSphereAccessTokenSupplier supplier = (RefreshableSphereAccessTokenSupplier) tokenSupplier; final CompletionStage<T> nextAttemptCompletionStage = supplier.getNewToken().thenComposeAsync(token -> execute(sphereRequest, token, ttl - 1)); CompletableFutureUtils.transferResult(nextAttemptCompletionStage, result); } else { result.completeExceptionally(throwable); } } else { result.complete(value); } }); return result; }
@Test public void testTransferResultError() throws Exception { final CompletableFuture<String> future = new CompletableFuture<>(); final RuntimeException e = new RuntimeException(); transferResult(failed(e), future); catchThrowable(() -> future.join()); assertThat(future.isCompletedExceptionally()).isTrue(); assertThat(blockForFailure(future)).isEqualTo(e); }