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
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方法中运行