I have a doubt about this code:
@Async
public CompletableFuture doFoo() {
CompletableFuture fooFuture = new CompletableFuture
Spring actually does all of the work behind the covers so you don't have to create the CompletableFuture
yourself.
Basically, adding the @Async
annotation is as if you called your original method (without the annotation) like:
CompletableFuture<User> future = CompletableFuture.runAsync(() -> doFoo());
As for your second question, in order to feed it to an executor, you can specify the exectutor bean name in the value of the @Async
annotation, like so:
@Async("myExecutor")
public CompletableFuture<User> findUser(String usernameString) throws InterruptedException {
User fooResult = longOp(usernameString);
return CompletableFuture.completedFuture(fooResult);
}
The above would basically be the following as if you called your original method, like:
CompletableFuture<User> future = CompletableFuture.runAsync(() -> doFoo(), myExecutor);
And all of your exceptionally
logic you would do with the returned CompletableFuture
from that method.