我编写此代码以分离大量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;,结果是预期的。
两个问题:
cache()
导致when
等待所有Monos完成吗?感谢。
答案 0 :(得分:0)
您应该尽可能多地尝试:
doOn*
运算符用于副作用之外的其他操作(如日志记录)您的代码可能看起来更像
List<MetricConfig> metricConfigs = //...
Mono<List<MetricDataModel>> data = Flux.fromIterable(metricConfigs)
.flatMap(config -> extractMetrics.queryMetricData(config))
.collectList();
此外,cache()
运算符不会等待流的完成(实际上是then()
的作业)。