spring - CompletableFuture 是否在重新抛出异常时完成?

标签 spring java-8 completable-future

我刚刚开始使用 CompletableFuture 并且已经爱上它了。

但是在使用 CompletableFuture 时,我发现的一件奇怪的事情是它的方法称为“异常(exception)”

假设我有一个 CompletableFuture<?> cf1.

现在,一旦数据到达,我的代码就会应用一些处理逻辑。如果出现异常,我使用异常方法重新抛出 MyCustomException

cf1  
.thenApply(myData->Some Processing Logic)  
.exceptionally(ex-> throw new MyCustomException())

cf.get(); 

有趣的是,对 get 方法的调用会无限期地挂起,直到我终止程序。这是否意味着如果 CompletableFuture 从异常 block 中重新抛出异常,Future 将不会被标记为完成?我需要明确地将其标记为完整吗?

最佳答案

来自文档 get如果 future 异常完成,方法会抛出异常

ExecutionException - if this future completed exceptionally

因此,您可以从异常返回一些值来识别thenApply期间引发的异常,并调用get方法获取值

第二种方式,在调用 get 方法之前,您可以使用 allOf 来完成该 future 对象。 ,并检查 future 是否异常完成

CompletableFuture.allOf(completableFuture);
completableFuture.isCompletedExceptionally();  //true

关于spring - CompletableFuture 是否在重新抛出异常时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66921194/

相关文章:

java - Spring事务管理调度器

java - 启动后 Spring Boot 应用程序失败 - 尝试调用不存在的方法。尝试是从以下位置进行的

java - 为什么顺序流和并行流的归约结果不同?

java - 如何在 Java 8 中多次使用 thenCompose 的结果?

java - 在 Java 中使用 CompletableFuture 并行执行 for 循环并记录执行

java - 线程与 CompletableFuture

java - Spring Social Google - 将一次性授权代码转换为服务器上的访问 token /刷新 token

Spring Boot 配置服务器

java - 使用 Java 8 lambda 遍历映射键

java - Spring:将String List的所有值注入(inject)bean