首页 > 解决方案 > 在异常时将可完成的未来加入当前线程

问题描述

我有一个分派请求并异步等待响应的方法调用。一旦响应进来,它就会触发一个回调来处理结果。

但是,如果出现故障(错误响应或其他故障),我想在调用线程中重新抛出异常。

dispatcher.dispatch(json)
.whenComplete((responseString, throwable) -> responses.handle(responseString));

在 lambda 表达式中重新抛出异常显然不起作用,因为它在不同的线程中。所以类似的东西

dispatcher.dispatch(json)
.whenComplete((responseString, throwable) -> responses.handle(responseString))
.joinExceptionally(throwable -> throw throwable);

此呼叫也不能阻塞。换句话说,一旦可完成的未来异常完成,是否有可能在调用线程中抛出异常,而不会阻塞?

标签: javacompletable-future

解决方案


这基本上是不可能的。

您希望异步处理请求,因此必须在另一个线程中处理该请求。您还希望在调用线程中引发异常,因此必须在与先前要求收缩的同一线程中引发异常(因为异常是通过调用堆栈传播的)。

通常dispatcher只用于调度请求,不应该用于处理异常。最好使用CompletableFuture的内置功能来处理CompletableFuture.handle(BiFunction<? super T, Throwable, ? extends U> fn).


推荐阅读