Mutiny多Uni结果合并时如何忽略失败仅保留成功结果?
解决方案
要实现忽略失败的Uni调用、收集所有成功结果并记录失败日志,核心思路是给每个独立的Uni添加失败处理逻辑:捕获异常后记录日志,再返回一个空列表作为"兜底"结果,这样整个合并操作就不会因为单个Uni失败而终止。
修改后的完整代码
import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.jboss.logging.Logger; // 声明日志实例,替换为你的类名 private static final Logger LOG = Logger.getLogger(YourClassName.class); List<Uni<List<Result>>> unis = new ArrayList<>(); for (Source source : sources) { Uni<List<Result>> safeUni = source.getResults() // 捕获失败并记录日志 .onFailure().invoke(throwable -> { LOG.error("从数据源获取数据失败", throwable); }) // 失败时返回空列表,避免整个合并流程中断 .recoverWithItem(Collections.emptyList()); unis.add(safeUni); } return Uni.combine().all().unis(unis).combinedWith( responses -> { List<Result> res = new ArrayList<>(); for (List<Result> response : responses) { res.addAll(response); } return res; } );
关键细节解释
onFailure().invoke(...):在Uni失败时执行日志记录的副作用操作,不会改变Uni本身的执行状态。recoverWithItem(Collections.emptyList()):将失败的Uni结果替换为空列表,确保合并操作能继续处理其他成功的Uni,不会导致整个合并结果失败。- 原有的合并逻辑无需修改,失败的Uni已被转换为返回空列表,不会对最终的结果集合产生干扰。
内容的提问来源于stack exchange,提问作者jf743
相关产品推荐
相关产品推荐

