
本文介绍如何使用 eclipse vert.x mutiny 的 `multi` 和 `uni` 实现对元素列表的**串行异步调用**,确保前一个完成后再触发下一个,并在任一调用失败时自动降级、继续后续流程。
在响应式编程中,「顺序执行多个异步操作」是一个常见但易出错的需求。尤其当每个操作返回 Uni
Mutiny 提供了简洁而强大的组合方式:Multi.createFrom().iterable(elements) 将列表转为流,再通过 .onItem().transformToUniAndConcatenate(...) 实现逐项触发、串行等待、失败不中断的效果:
MultiresultMulti = Multi.createFrom() .iterable(elements) .onItem() .transformToUniAndConcatenate(element -> asyncMethod(element) .onFailure() .recoverWithItem("fallback-result-for-" + element.getId()) // 或 null、空字符串等业务默认值 );
⚠️ 关键点说明:
- transformToUniAndConcatenate 是核心:它保证前一个 Uni 完成(无论成功或失败)后,才订阅下一个 Uni,天然实现串行;
- onFailure().recoverWithItem(...) 替代了原始答案中的 continueWith(该方法已过时),用于定义失败时的降级值,确保流持续发射;
- 若需记录错误日志而非静默吞掉异常,可改用 onFailure().invoke(Throwable::printStackTrace).recoverWithItem(...);
- 最终得到的是 Multi
;如需收集全部结果为 List ,可追加 .collect().asList(); - 切勿使用 transformToUniAndFlatMap —— 它会并发执行所有 Uni,违背“顺序”要求。
✅ 总结:
当面对「列表 → 逐个异步调用 → 串行 + 容错」场景时,优先选用 Multi.iterable(...).transformToUniAndConcatenate(...) 组合,配合 onFailure().recoverWithItem() 做优雅降级。这是 Mutiny 中兼顾语义清晰性与行为确定性的标准实践。










