Spring @Async con CompletableFuture
Tengo una duda 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;
}
La pregunta es: ¿DoFoo regresa a FooFuture solo después de que LongOp haya terminado (ya sea de manera correcta o excepcional) y, por lo tanto, está devolviendo futuros ya completados o Spring está haciendo algo de magia y regresando antes de ejecutar el cuerpo? Si el código está bloqueando en longOp (), ¿cómo expresaría que el cálculo se está enviando a un ejecutor?
Quizás esto? ¿Cualquier otra manera?
@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;
}