Spring @Async с CompletableFuture

Я сомневаюсь в этом коде:

@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;
}

вопрос в том, возвращает ли doFoo fooFuture только после того, как лонгоп закончил (правильно или исключительно) и, следовательно, возвращает уже завершенные фьючерсы или весна делает какую-то магию и возвращается перед выполнением тела? Если код блокируется на longOp (), как бы вы выразили, что вычисление передается исполнителю?

возможно это? Как-нибудь иначе?

@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;
}

1 ответов


Весна на самом деле делает всю работу за обложками, поэтому вам не нужно создавать CompletableFuture себя. В принципе, добавление @Async аннотации как будто вы назвали свой исходный метод (без аннотации), например:

CompletableFuture<String> future = CompletableFuture.runAsync(() -> doFoo());

Что касается вашего второго вопроса, чтобы передать его исполнителю, вы можете указать имя компонента exectutor в стоимостью на @Async аннотация, например:

    @Async("myExecutor")
    public CompletableFuture<User> findUser(String user) throws InterruptedException {
        String fooResult = longOp();
        return CompletableFuture.completedFuture(fooResult);
    }

выше будет в основном быть следующим как будто вы назвали свой оригинальный способ, как:

CompletableFuture<String> future = CompletableFuture.runAsync(() -> doFoo(), myExecutor);

и все exceptionally логика вы бы сделали с возвращенным CompletableFuture от этого метода.