Spring @Async com CompletableFuture
Tenho uma dúvida sobre este código:
@Async
public CompletableFuture<String> doFoo() {
CompletableFuture<String> fooFuture = new CompletableFuture<>();
try {
String fooResult = longOp();
fooFuture.complete(fooResult);
} catch (Exception e) {
fooFuture.completeExceptionally(e);
}
return fooFuture;
}
A pergunta é: o doFoo retorna o fooFuture somente depois que o longOp terminou (corretamente ou excepcionalmente) e, portanto, está retornando futuros já concluídos ou o Spring está fazendo alguma mágica e retornando antes de executar o corpo? Se o código estiver bloqueando em longOp (), como você expressaria que a computação está sendo alimentada a um executor?
Talvez isso? Qualquer outra maneira?
@Async
public CompletableFuture<String> doFoo() {
CompletableFuture<String> completableFuture = new CompletableFuture<>();
CompletableFuture.runAsync(() -> {
try {
String fooResult = longOp();
completableFuture.complete(fooResult);
} catch (Exception e) {
completableFuture.completeExceptionally(e);
}
});
return completableFuture;
}