Spring@Async与CompletableFuture

Spring@Async与CompletableFuture,spring,completable-future,Spring,Completable Future,我对该代码有疑问: @Async public CompletableFuture<String> doFoo() { CompletableFuture<String> fooFuture = new CompletableFuture<>(); try { String fooResult = longOp(); fooFuture.complete(fooResult); } catch (E

我对该代码有疑问:

@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;
}
@Async
公共CompletableFuture doFoo(){
CompletableFuture fooFuture=新的CompletableFuture();
试一试{
字符串fooResult=longOp();
fooFuture.complete(fooResult);
}捕获(例外e){
footfuture.completeetyexception(e);
}
回归未来;
}
问题是:doFoo是否只有在longOp完成后(正确或例外)才返回fooFuture,因此是否返回已经完成的futures,或者Spring是否在执行body之前执行了一些魔术并返回?如果代码在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;
}
@Async
公共CompletableFuture doFoo(){
CompletableFuture CompletableFuture=新的CompletableFuture();
CompletableFuture.runAsync(()->{
试一试{
字符串fooResult=longOp();
可完成的未来。完成(fooResult);
}捕获(例外e){
完全未来。完全例外(e);
}
});
回归未来;
}

Spring实际上完成了封面后面的所有工作,因此您不必自己创建可完成的未来。 基本上,添加
@Async
注释是就像调用原始方法(没有注释)一样,如下所示:

上面的内容基本上是如下,就像你调用了你的原始方法一样,比如:

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

你所有的
异常
逻辑,你都可以使用从该方法返回的
CompletableFuture

我明白了,所以基本上@Async注释将我的方法提升到CompletableFuture,异常会自动捕获并隐藏到CompletedExcependely中。。。呃,我最近做了太多Scala来避免混淆:DYep,所以
get()
将返回您的
字符串
结果和/或传播异常,或者您可以与供应商一起完成它
异常
。即使我从未.join()或.get(),它也会运行吗?
    @Async("myExecutor")
    public CompletableFuture<User> findUser(String usernameString) throws InterruptedException {
        User fooResult = longOp(usernameString);
        return CompletableFuture.completedFuture(fooResult);
    }
CompletableFuture<User> future = CompletableFuture.runAsync(() -> doFoo(), myExecutor);