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);