Ho riscontrato uno strano comportamento del metodo CompletableFuture thenCompose di Java 8. Ho due test che differiscono solo in ordine di esecuzione. Entrambi i test simulano il fallimento di CompletableFuture generato in thenCose.Perché Java 8 CompletableFuture thenCompose genera un'eccezione diversa in base all'ordine di completamento?
@Test
public void completedAfter() {
CompletableFuture<String> future1 = new CompletableFuture<>();
CompletableFuture<String> future2 = new CompletableFuture<>();
future1.thenCompose(x -> future2).whenComplete((r, e) -> System.out.println("After: " + e));
future1.complete("value");
future2.completeExceptionally(new RuntimeException());
}
@Test
public void completedBefore() {
CompletableFuture<String> future1 = new CompletableFuture<>();
CompletableFuture<String> future2 = new CompletableFuture<>();
future1.complete("value");
future2.completeExceptionally(new RuntimeException());
future1.thenCompose(x -> future2).whenComplete((r, e) -> System.out.println("Before: " +e));
}
L'output è:
After: java.util.concurrent.CompletionException: java.lang.RuntimeException
Before: java.lang.RuntimeException
La domanda è: perché è l'eccezione avvolto in CompletionException
in un caso ma non nell'altro?
Aggiornamento: Here è un bug report correlato. È stato contrassegnato e risolto come un bug in JDK.
Hai guardato ListenableFuture di Guava? Se non sei bloccato nel framework, ti suggerisco di utilizzare l'implementazione di Guava. Nella mia visione totalmente opinata, è una funzionalità completa e molto più facile da usare. Disclamer, non sono in alcun modo affiliato con Google. –
C'è stato un sacco di traffico su Completablefuture sulla lista degli interessi di concorrenza. Le liste di novembre potrebbero interessarti: http://cs.oswego.edu/pipermail/concurrency-interest/2014-November/subject.html – edharned