需要帮助以了解上述代码示例的平面地图执行

时间:2019-04-03 17:35:30

标签: spring-webflux project-reactor

我正在尝试使用Flux和Webclient调用rest api并累积结果。 我想了解以下代码的flatMap运算符的执行。

  • 列表-包含50000个元素。
  • restClient -这是一个WebClient。 WebClient.builder().baseUrl(url).filter(ExchangeFilterFunctions.basicAuthentication(userId, pwd)).build()
  • restClient.getResult -返回一个Mono。 client.get().uri(uri).retrieve().bodyToMono(returnType)

第一个日志是将线程名称打印为主要的某些编号。元素,然后开始打印反应堆-http-nio-(thread-no)。 第二个日志是将线程名称打印为react-http-nio-(thread-no)。 请在这里说明线程执行和切换是如何发生的。

        Flux.fromIterable(list)
            .log()
            .map(e -> e.trim())
            .flatMap(e -> restClient.getResult(client, e, String.class))//e is being used to create uri
            .log()
            .subscribe(e -> result.add(e));

1 个答案:

答案 0 :(得分:0)

downloadUrlThumb()有一个flatMap参数,默认为256。 订阅后,它将从源(concurrency)请求256个元素,并将它们映射到内部发布者(fromIterable调用)。

这是在订阅线程(这里是WebClient线程)中完成的。

一旦内部有256个元素“运行中”,main将在内部完成时根据需要进行补充,方法是从可迭代对象中请求另一个源元素,然后将其映射到新的flatMap内部。

这是在刚刚完成的内部线程中完成的,这里是netty WebClient线程。