Spring Webflux:如何使用Tuple3将三个Flux对象聚合为一个
正确合并三个Flux对象的解决方案
错误原因
你当前代码报错的核心问题是**Mono.zip()的参数要求是Mono类型,而非Flux**。Mono.zip()的作用是合并多个Mono的最终结果,而不是直接把Flux对象作为元素进行合并。
解决方案
根据你的实际需求,分两种情况处理:
场景1:仅需将三个Flux对象封装到聚合类中
如果你的目的只是把三个Flux作为发布者传递给下游(不需要等待它们发射数据),直接用Mono.just()封装即可,完全不需要zip:
public class OrderService { private final AppWebClient appWebClient; public Mono<OrderDetailsAggregate> getAggregatedOrderDetails(List<String> orderNoList1, List<String> orderNoList2, List<String> orderNoList3) { Flux<Map<String, List<String>>> fluxOne = this.appWebClient.getFluxOne(orderNoList1); Flux<Map<String, String>> fluxTwo = this.appWebClient.getFluxTwo(orderNoList2); Flux<Map<String, List<String>>> fluxThree = this.appWebClient.getFluxThree(orderNoList3); // 直接封装三个Flux对象到聚合类,返回Mono return Mono.just(OrderDetailsAggregate.create(fluxOne, fluxTwo, fluxThree)); } }
这种方式下,combine方法可以直接删除,因为不需要再处理Tuple。
场景2:需要等待三个Flux完成并收集结果后聚合
如果你的需求是等待三个Flux都发射完所有数据,再把它们的结果聚合为Flux封装到聚合类中,需要先将每个Flux转为Mono(收集其所有元素),再用Mono.zip()合并:
public class OrderService { private final AppWebClient appWebClient; public Mono<OrderDetailsAggregate> getAggregatedOrderDetails(List<String> orderNoList1, List<String> orderNoList2, List<String> orderNoList3) { // 将每个Flux转为Mono,收集所有元素到List Mono<List<Map<String, List<String>>>> monoOne = appWebClient.getFluxOne(orderNoList1).collectList(); Mono<List<Map<String, String>>> monoTwo = appWebClient.getFluxTwo(orderNoList2).collectList(); Mono<List<Map<String, List<String>>>> monoThree = appWebClient.getFluxThree(orderNoList3).collectList(); // 合并三个Mono的结果,再转为Flux封装到聚合类 return Mono.zip(monoOne, monoTwo, monoThree) .map(tuple -> OrderDetailsAggregate.create( Flux.fromIterable(tuple.getT1()), Flux.fromIterable(tuple.getT2()), Flux.fromIterable(tuple.getT3()) )); } }
这里用collectList()收集Flux的所有元素,你也可以根据实际需求替换为last()(取最后一个元素)、reduce()(归约结果)等操作,只要能将Flux转为Mono即可。
内容的提问来源于stack exchange,提问作者heisenberg
相关产品推荐
相关产品推荐

