Spring reactor webclient 使用 flatmap 和 takewhile 顺序请求

Spring reactor webclient sequential requests with flatmap and takewhile

我想从第三方资源中检索所有页面。为此,我写了这个:

final WebClient webClient = WebClient.builder()
     .baseUrl("http://resource.com")
     .build();
Flux.fromStream(IntStream.iterate(0, i -> i + 1).boxed())
     .flatMap(i -> webClient.get()
          .uri("/data?page={page}", i)
          .retrieve()
          .bodyToMono(Page.class))
     .takeWhile(Page::isMoreAvailable)
     .flatMapIterable(Page::getData)

但它不能正常工作。 flatMap 被多次调用,它在 takeWhile 检索第一个响应之前对不同的页面执行多个请求。

如果我改成这样:

.map(i -> webClient.get()
        .uri("/data?page={page}", i)
        .retrieve()
        .bodyToMono(Page.class)
        .block())

效果很好。

那么,我怎样才能用 flatMap 实现这一点?

好的,所以 flatmap 处理并发

.flatMap(i -> webClient.get()
   .uri("/data?page={page}", i)
   .retrieve()
   .bodyToMono(Page.class), 1)

成功了。