等待运行Reactor Mono实例以完成

时间:2018-03-21 01:21:36

标签: project-reactor spring-webflux

我编写此代码以分离大量WebClient(受reactor.ipc.netty.workerCount限制),立即启动Mono,等待所有Monos完成:

   List<Mono<List<MetricDataModel>>> monos = new ArrayList<>(metricConfigs.size());
   for (MetricConfig metricConfig : metricConfigs) {
        try {
            monos.add(extractMetrics.queryMetricData(metricConfig)
                  .doOnSuccess(result -> {
                      metricDataList.addAll(result);
                  })
                  .cache());
        } catch (Exception e) {
        }
    }

    Mono.when(monos)
          .doFinally(onFinally -> {
              Map<String, Date> latestMap;
              try {
                  latestMap = extractInsights.queryInsights();
                  Transform transform = new Transform(copierConfig.getEventType());
                  ArrayList<Event> eventList = transform.toEvents(latestMap, metricDataList);
              } catch (Exception e) {
                  log.error("copy: mono: when: {}", e.getMessage(), e);
              }
          })
          .block();

它起作用&#39;,结果是预期的。

两个问题:

  1. 是否正确cache()导致when等待所有Monos完成吗?
  2. 效率?有没有办法让这更快?
  3. 感谢。

1 个答案:

答案 0 :(得分:0)

您应该尽可能多地尝试:

  • 使用Reactor运算符并组成单个反应链
  • 避免将doOn*运算符用于副作用之外的其他操作(如日志记录)
  • 避免共享状态

您的代码可能看起来更像

List<MetricConfig> metricConfigs = //...
Mono<List<MetricDataModel>> data = Flux.fromIterable(metricConfigs)
    .flatMap(config -> extractMetrics.queryMetricData(config))
    .collectList();

此外,cache()运算符不会等待流的完成(实际上是then()的作业)。