Это невозможно, потому что, как объяснил Хольгер в комментариях, orTimeout()
применяется только к CompletableFuture
, на котором вы его вызываете. Нет ссылки на цепочку вызовов (или, фактически, на график), которая ведет к этому будущему.
Однако вы можете проверить все промежуточные CompletableFuture
, сохранив их ссылки:
CompletableFuture<ComplianceCandidate> init = CompletableFuture.supplyAsync(() -> candidate, pool);
CompletableFuture<Result1> future1 = init.thenApply(Task1::doWork);
CompletableFuture<Result2> future2 = future1.thenApply(Task2::doWork);
…
CompletableFuture<Result7> future7 = future6.thenApply(Task7::doWork);
CompletionStage<Result7> future7OrTimeout = future7.orTimeout(10, TimeUnit.SECONDS);
, а затем проверьте каждый из них по отдельности:
CompletableFuture<ComplianceCandidate> futureTask = future7OrTimeout.exceptionally(throwable -> {
if (!future1.isDone() || future1.isCompletedExceptionally()) {
System.out.println("Task1 failed");
} else if (!future2.isDone() || future2.isCompletedExceptionally()) {
System.out.println("Task2 failed")
} else …
});
(я позволяю вам сделать код более общим c с циклами в зависимости от ваших фактических вызовов)