我如何等待多个单声道一次完成并获得价值

How do I wait for multiple Mono's to complete at once and get the value

问题与 Waiting for running Reactor Mono instances to complete 类似,但我想在另一个 Mono 中获得理想的结果。这是我的代码。我尝试了物化解决方案,但没有成功。

    @GetMapping("/bounced")
    public Mono<Map<String, Object>> bounced(
        @RequestHeader("X-B3-Traceid") String traceId,
        @RequestHeader(HttpHeaders.AUTHORIZATION) String authorization
    ) {

        final Mono<Map<String, Object>> sample = webClient.get()
            .uri("http://sample:8080/")
            .header(HttpHeaders.AUTHORIZATION, authorization)
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<>() {
            });

        final Mono<Map<String, Object>> httpGet = webClient.get()
            .uri("http://httpbin.org/get")
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<>() {
            });

        final Mono<Map<String, Object>> anything = webClient.get()
            .uri("http://httpbin.org/anything/foo")
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<>() {
            });

/*
   Tried this and it does start it up, but it triggers another "download" in the return block.

        Mono.when(anything, sample, httpGet)
            .subscribe();
            .materialize()
            .block();
*/
        return Mono.just(Map.of("traceFromBounced", traceId,
            "anything", anything.block(),
            "sample", sample.block(),
            "httpGet", httpGet.block()));

基于@K.Nicholas' 的评论,我让它工作了

    @GetMapping("/bounced")
    public Mono<Map<String, Object>> bounced(
        @RequestHeader("X-B3-Traceid") String traceId,
        @RequestHeader(HttpHeaders.AUTHORIZATION) String authorization
    ) {

        final Mono<Map<String, Object>> sample = webClient.get()
            .uri("http://sample:8080/")
            .header(HttpHeaders.AUTHORIZATION, authorization)
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<>() {
            });

        final Mono<Map<String, Object>> httpGet = webClient.get()
            .uri("http://httpbin.org/get")
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<>() {
            });

        final Mono<Map<String, Object>> anything = webClient.get()
            .uri("http://httpbin.org/anything/foo")
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<>() {
            });

        return Mono.zip(anything, sample, httpGet)
            .map(t -> Map.of("traceFromBounced", traceId,
                "anything", t.getT1(),
                "sample", t.getT2(),
                "httpGet", t.getT3()));

    }

这是显示它并行运行的 zipkin 输出