如何控制Reactor中Mono.zip(list)按顺序执行?
解决Mono列表串行执行并收集结果的方案
你当前使用Mono.zip会并行启动所有Mono实例,导致内存消耗较高。要实现依次执行并收集结果,可以采用Reactor提供的以下两种常用方案:
方案一:Flux.concat + collectList(推荐)
通过Flux.concat按顺序订阅每个Mono(前一个执行完成后才启动下一个),再用collectList将所有结果收集为List,最终得到包含完整结果的Mono<List<T>>:
var monos = List.of(m1, m2, m3); Flux.concat(monos) .collectList() .subscribe(results -> { // 处理结果列表,顺序与原monos列表完全一致 });
方案二:Stream.reduce链式串联
如果需要更底层的链式控制,可以通过Stream的reduce方法,将每个Mono依次串联,逐步收集结果:
var monos = List.of(m1, m2, m3); monos.stream() .reduce(Mono.just(new ArrayList<>()), (accumulatorMono, nextMono) -> accumulatorMono.flatMap(resultList -> nextMono.map(nextResult -> { resultList.add(nextResult); return resultList; }) ), (list1, list2) -> { list1.addAll(list2); return list1; }) .subscribe(finalResultList -> { // 处理最终收集的结果列表 });
两种方案都能保证Mono按顺序执行,避免并行带来的内存占用问题,其中方案一代码更简洁,是Reactor中处理这类场景的常规做法。
内容的提问来源于stack exchange,提问作者PeiSong
相关产品推荐
相关产品推荐

