【问题标题】:How to zip more than 8 different types of mono如何压缩 8 种以上不同类型的单声道
【发布时间】:2023-01-21 15:29:24
【问题描述】:

我正在尝试同时进行 9 个 api 调用。所有这些调用都会返回不同的响应对象。在此之前,我们有 8 个 api 调用,因为这些单声道是不同的类型,所以我使用如下所示的 Mono.zip。

Mono<ResponseEntity<Service1Response>> monoService1 = callService1();
Mono<ResponseEntity<Service2Response>> monoService2 = callService2();
...
Mono<ResponseEntity<Service3Response>> monoService7 = callService7();
Mono<ResponseEntity<Service4Response>> monoService8 = callService8();

MixResponse mix = Mono.zip(monoService1, monoService2, monoService3, monoService4, monoService5, monoService6, monoService7, monoService8).flatMap(response -> {
  MixResponse mixResp = new MixResponse();
  mixResp.setResponse1(response.getT1().getBody());
  mixResp.setResponse2(response.getT2().getBody());
  mixResp.setResponse3(response.getT3().getBody());
  mixResp.setResponse4(response.getT4().getBody());
  mixResp.setResponse5(response.getT5().getBody());
  mixResp.setResponse6(response.getT6().getBody());
  mixResp.setResponse7(response.getT7().getBody());
  mixResp.setResponse8(response.getT8().getBody());
  return Mono.just(mixResp);
})).block();

但现在我们多了一项服务,而 Mono.zip 最多只支持 8 个单声道。除了 Mono.zip 之外还有什么我可以在我的情况下使用的吗?对不起,如果这个问题看起来很愚蠢。我是 spring-webflux 的新手。提前致谢。

【问题讨论】:

    标签: java spring spring-webflux project-reactor


    【解决方案1】:

    您可以使用将 Iterable 作为参数和组合器函数的 Mono.zip 来组合结果并强制转换为特定类型:

    &lt;R&gt; Mono&lt;R&gt; zip(final Iterable&lt;? extends Mono&lt;?&gt;&gt; monos, Function&lt;? super Object[], ? extends R&gt; combinator)

    
    List<Mono<? extends ResponseEntity<?>>> requests = List.of(
            monoService1, 
            monoService2, 
            monoService3, 
            monoService4
    );
    
    Mono.zip(requests, responses -> {
        MixResponse mixResp = new MixResponse();
        mixResp.setResponse1(((ResponseEntity<Service1Response>) responses[0]).getBody());
        mixResp.setResponse2(((ResponseEntity<Service2Response>) responses[1]).getBody());
        mixResp.setResponse3(((ResponseEntity<Service3Response>) responses[2]).getBody());
        mixResp.setResponse4(((ResponseEntity<Service4Response>) responses[3]).getBody());
        return mixResp;
    });
    

    【讨论】:

    • 谢谢亚历克斯,这个通用的表达就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2011-08-09
    • 2015-11-01
    相关资源
    最近更新 更多