java - 在异常时将可完成的未来加入当前线程
问题描述
我有一个分派请求并异步等待响应的方法调用。一旦响应进来,它就会触发一个回调来处理结果。
但是,如果出现故障(错误响应或其他故障),我想在调用线程中重新抛出异常。
dispatcher.dispatch(json)
.whenComplete((responseString, throwable) -> responses.handle(responseString));
在 lambda 表达式中重新抛出异常显然不起作用,因为它在不同的线程中。所以类似的东西
dispatcher.dispatch(json)
.whenComplete((responseString, throwable) -> responses.handle(responseString))
.joinExceptionally(throwable -> throw throwable);
此呼叫也不能阻塞。换句话说,一旦可完成的未来异常完成,是否有可能在调用线程中抛出异常,而不会阻塞?
解决方案
这基本上是不可能的。
您希望异步处理请求,因此必须在另一个线程中处理该请求。您还希望在调用线程中引发异常,因此必须在与先前要求收缩的同一线程中引发异常(因为异常是通过调用堆栈传播的)。
通常dispatcher只用于调度请求,不应该用于处理异常。最好使用CompletableFuture
的内置功能来处理CompletableFuture.handle(BiFunction<? super T, Throwable, ? extends U> fn)
.
推荐阅读
- javascript - 从 Recharts 的另一个组件中获取数据
- java - RecyclerView 中的重复项
- git - 我正确使用 git rebase 吗?
- java - 如果其中已存在相同值的对象,则替换 ArrayList 的元素
- algorithm - 如何将一个值限制在一个范围内?
- android - ConstraintLayout 中的 ImageButton 缩放问题
- android - 如何以这种方式在日志中打印文本 R.string.text
- css - Align boostrap div at the end
- python - 如何在 n 秒后打印一些东西?
- java - Spring MongoDb BasicQuery equivalent for Aggregations