如何用 CompletableFuture 的 allOf 和 exceptionally 构建自愈式异步网关实现长尾词功能?
- 内容介绍
- 相关推荐
本文共计791个文字,预计阅读时间需要4分钟。
使用 `CompletableFuture.allOf` 配置 `exceptionally` 构建 自激型 异步网关,核心在于:
allOf 的本质与关键限制
CompletableFuture.allOf 只表示“全部已结束”,不关心成功或失败;返回类型固定为 CompletableFuture<void></void>,不聚合结果,也不传播异常。这意味着:
- 它不能直接拿到每个子任务的返回值,需额外收集原始 future 列表
- 任一子任务抛异常,
allOf对应的 future 仍会完成,但状态为“异常完成” -
isCompletedExceptionally()可快速判断是否有失败,但具体是哪个、什么错,得遍历原始 futures 调用getNow(null)或join()(后者会重抛异常)
exceptionally 的定位:兜底拦截,非全局捕获
exceptionally 只作用于它所挂载的那个 future。对 allOf 返回的 future 使用 exceptionally,只能捕获“allOf 自身构造或触发过程中的异常”(极少发生),**无法捕获其内部任意子任务的异常**。
本文共计791个文字,预计阅读时间需要4分钟。
使用 `CompletableFuture.allOf` 配置 `exceptionally` 构建 自激型 异步网关,核心在于:
allOf 的本质与关键限制
CompletableFuture.allOf 只表示“全部已结束”,不关心成功或失败;返回类型固定为 CompletableFuture<void></void>,不聚合结果,也不传播异常。这意味着:
- 它不能直接拿到每个子任务的返回值,需额外收集原始 future 列表
- 任一子任务抛异常,
allOf对应的 future 仍会完成,但状态为“异常完成” -
isCompletedExceptionally()可快速判断是否有失败,但具体是哪个、什么错,得遍历原始 futures 调用getNow(null)或join()(后者会重抛异常)
exceptionally 的定位:兜底拦截,非全局捕获
exceptionally 只作用于它所挂载的那个 future。对 allOf 返回的 future 使用 exceptionally,只能捕获“allOf 自身构造或触发过程中的异常”(极少发生),**无法捕获其内部任意子任务的异常**。

