当前位置: 首页 > 知识库问答 >
问题:

平面映射未执行的通量

闻人和泽
2023-03-14

我有一个包含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);
}

所以我跟着这篇文章同时发送,以尽量减少响应时间,但是平板地图里面的代码永远不会执行:

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);
});

共有1个答案

鱼渝
2023-03-14

在反应式编程中,有生产者和订阅者。虽然制作人可以输出结果,但如果没有人在听这些结果,那就没有任何好处——订阅者就是在听这些结果。订阅者处理生产者的输出,并对结果进行有意义的处理。对于反应式编程来说,如果订阅者没有“监听”结果,那么生产者就不会执行任何代码。

所以在这种情况下,flatmap()是生产者。并且它不会执行任何代码,除非有订阅服务器来处理输出。

简单的回答是在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-e8eaf928a78chttps://projectreactor.io/docs/core/release/reference/

 类似资料:
  • 假设我有这样的代码: 输出是相同的线程名称,所以这里没有的好处--我的意思是有一个线程来完成所有的工作。 在内部有以下代码: 我理解强制属性如果“outer”流将是并行的(它们可能会阻塞),“outer”将不得不等待“flatmap”完成,反过来(因为使用了相同的公共池),但为什么总是强制这样做呢? 这是一个可以在以后的版本中改变的东西吗?

  • 前端将这个json发送到我的API 控制器:

  • 我对webflux比较陌生,我想找到解决方案,在有条件时避免嵌套flatMap: 如何防止这种分支条件平面映射混乱?我无法想象如果我在项目中有另一个实体。会有更多嵌套的平面地图?

  • 我很难找到一个优雅的解决方案来链接一些期货。我试图实现的方法看起来像这样(它是缓存的一部分): 算法大致如下: 如果密钥被锁定,则立即通过运行时异常(使用 Future.failed 是否会提前? 否则打开 块,因为它需要一些时间来检索密钥 要么返回一个直,然后返回未来和方法的结果 或者它需要运行 最后一步意味着我需要从未来内部对未来进行“扁平化”。也就是说,我不能做一个,所以我想策略是使用。 现

  • 我有一个Spring Boot应用程序,其中包括Spring Actuator在 我的配置是这样的 但是,当我尝试使用检查endpoint时,我的浏览器显示 在我的IntelliJ想法中,我可以看到执行器选项卡,它似乎在那里工作,但没有URL映射。有人能帮忙吗?

  • 我在Tomcat 8上使用Spring 4 WebSocket,我有以下配置: 我的Spring控制器具有以下方法: 所以我在这里尝试做的是,如果客户端1想要向客户端2发送消息,他将使用。然后,Spring控制器将消息推送到主题。 我在客户端中编写了以下代码: 连接工作正常,只是我的应用程序的上下文根。 我的客户端中还有以下代码用于发送消息: 两个变量(和)都是可访问的,我没有从这部分代码中得到任