java - FlatMap a Flux 未执行

标签 java spring-webflux project-reactor

我有一个包含 240 个项目的列表,使用 for 完整发送该列表需要 1 个多小时。

List<Map<String, Object>> conventions = mapConventions(objects, referentialService);

for(Map<String, Object> item : conventions) {
        webClient.post()
        .uri(configProperties.getUrl().getConvention() + CONVENTION)
        .bodyValue(objectMapper.convertValue(item, JsonNode.class))
        .retrieve()
        .bodyToMono(String.class);
}

所以我遵循了这个article同时发送以最大限度地缩短响应时间,但 flatmap 内的代码永远不会执行:

Flux.fromIterable(conventions).flatMap(item ->  {
    System.out.print(item);
    return webClient.post()
            .uri(configProperties.getUrl().getConvention() + CONVENTION)
            .bodyValue(objectMapper.convertValue(item, JsonNode.class))
            .retrieve()
            .bodyToMono(String.class);
});

最佳答案

在响应式编程中,有生产者和订阅者。虽然生产者可以输出结果,但如果没有任何东西在监听这些结果,那么它就没有任何好处——这就是订阅者发挥作用的地方。订阅者处理生产者的输出,并对结果执行一些有意义的操作。这是响应式(Reactive)编程的基础,如果订阅者没有“监听”结果,生产者将不会执行任何代码。

因此,在本例中,flatmap() 是生产者。除非有订阅者来处理输出,否则它不会执行任何代码。

简短的答案是在平面图末尾添加 subscribe() 调用。看起来像这样。

Flux.fromIterable(conventions).flatMap(item ->  {
    System.out.print(item);
    return webClient.post()
            .uri(configProperties.getUrl().getConvention() + CONVENTION)
            .bodyValue(objectMapper.convertValue(item, JsonNode.class))
            .retrieve()
            .bodyToMono(String.class);
}).subscribe();

许多教程都是关于此的。 例如: https://spring.io/blog/2016/06/13/notes-on-reactive-programming-part-ii-writing-some-code https://medium.com/@olehdokuka/mastering-own-reactive-streams-implementation-part-1-publisher-e8eaf928a78c https://projectreactor.io/docs/core/release/reference/

关于java - FlatMap a Flux 未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70569881/

相关文章:

java - 使用java复制节点内的所有元素,但不复制XML中的节点标签

java - 将 REST 查询参数存储为静态字段

java - 如何将字符串转换为字节并返回

java - doOnNext() 不会被调用 Spring Webflux

java - 何时在 Mono 上使用 .flatMap() 而不是仅仅对值调用函数?

project-reactor - 从助焊剂转换为单声道

java - 从 Android 中的 ListView 中获取选中项目的总数

java - 如何限制 Flux<Map<K,V>> 中的元素数量并将其映射到自定义结果

spring - 使用 Spring Webflux 恢复文件下载以及 Spring 中的静态文件服务

spring-boot - 如何将 Spring WebClient 与 Jetty 一起使用,而不是 Netty?