Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待多个WebClient Flux请求完成?_Java_Spring Webflux_Project Reactor - Fatal编程技术网

Java 如何等待多个WebClient Flux请求完成?

Java 如何等待多个WebClient Flux请求完成?,java,spring-webflux,project-reactor,Java,Spring Webflux,Project Reactor,我想: 订阅返回Flux的多个端点并输出我收到的消息 等待所有端点输出所有消息后再继续 避免“一起”处理来自多个端点(例如Flux.zip)的消息,因为这些端点将返回数量不均匀的消息,并且在逻辑上彼此没有连接 如果一个或多个端点生成无限多条消息,则永久阻止 以下代码满足1和3,但不满足2和4: Stream.of("http://service1.com", "http://service2.com", "http://servi

我想:

  • 订阅返回Flux的多个端点并输出我收到的消息
  • 等待所有端点输出所有消息后再继续
  • 避免“一起”处理来自多个端点(例如Flux.zip)的消息,因为这些端点将返回数量不均匀的消息,并且在逻辑上彼此没有连接
  • 如果一个或多个端点生成无限多条消息,则永久阻止
  • 以下代码满足1和3,但不满足2和4:

            Stream.of("http://service1.com", "http://service2.com", "http://service3.com")
                    .forEach(service -> {
                        webClient.get()
                                .retrieve()
                                .bodyToFlux(String.class)
                                .map(message -> service + ": " + message)
                                .subscribe(System.out::println);
                    });
    
            System.out.println("Received all messages");
    
    在所有端点完成之前,不应打印“已接收所有消息”行。但是,由于订阅是异步的,因此该行几乎立即打印,我的应用程序继续而不是等待


    我应该怎么做呢?

    我相信下面的代码片段在你的问题中达到了4分之3,尽管我不觉得我完全理解第三个要求。让我看看这个例子是否满足需要,如果不满足,缺少什么

            Flux.just("http://service1.com", "http://service2.com", "http://service3.com")
                .flatMap(url -> webClient.get()
                        .uri(url)
                        .retrieve()
                        .bodyToFlux(String.class)
                        .map(body -> url + ":" + body)
                )
                .collectList()
                .doOnNext(list -> LOG.info("Received all messages"))
                .subscribe(list -> LOG.info("" + list));
    

    flatMap是将通量合并在一起的一种方法,但也可以使用Flux.merge

    列出单独的结果=
    流http://service1.com", "http://service2.com", "http://service3.com")
    .地图(
    服务->
    网络客户//
    .get()
    .retrieve()
    .bodyToFlux(字符串类))
    .collect(toList());
    Flux mergedResults=Flux.merge(个别结果);//在所有单个通量完成之前,将不会完成。
    合并结果//
    .doOnNext(System.out::println)
    .然后()
    .block();//阻止此线程,直到mergedResults完成
    System.out.println(“已收到所有消息”);
    
    collectList不是一个好主意,如果有无限流的机会,因为日志消息doOnComplete可能更惯用,因此问题编写者可能需要使用block或blockLast,如果此代码只是在main方法中运行