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

Spring Webflux在返回响应之前等待所有Flux

刘海
2023-03-14

我正在使用Spring Webflow R2DBC将一些数据插入数据库。

要求提供数据-

控制器

@RestController
public class UtilController {
  private final FooService service;

  @Autowired
  public UtilController(FooService service) { this.service = service; }

  @GetMapping(path = "/load-data")
  public Mono<List<Foo>> loadFoos() { return service.addFoos(); }
}

服务

public Mono<List<Foo>> addFoos() {
  return webClient.getSomeStuff()
      .map(results -> results.stream()
          .map(/* ...transform to domain model */)
          .toList())
      .map(foos -> {
        // This is the problem site.
        List<Foo> buf = new ArrayList<>();
        foos.forEach(f -> {
          fooDao.createFoo(l)
              .doOnNext(buf::add)
              .next()
              .subscribe();
        });

        return buf;
      });
}

public Flux<Foo> createFoo(final Foo foo) {
  var query = "<INSERT_STUFF_STATEMENT>";

  // "publisher" is private final Publisher<? extends Connection> publisher;
  var connection = Mono.from(publisher);
  return connection.flatMapMany(c -> c.createStatement(query)
      .bind("STUFF", foo.getStuff())
      .execute())
      .map(result -> Foo.builder()
          .stuff(whatever)
          .build());
}

主要问题是我不知道如何让它等待所有结果返回并添加到最终列表中


共有1个答案

伯庆
2023-03-14

您是否必须使用webClient(实际上是一个没有数据库访问的外部API)?否则,我建议使用R2DBCReposition并返回通量,并从中映射数据?如果您真的想调用外部数据库,迭代列表通常是阻塞的(应该会引发错误)。此外,Lambda中的变量应该是final或实际上是final,所以我不确定发生了什么(您所称的数据库是反应型的),但仍然会尝试返回Flux而不是Mono

 类似资料:
  • 问题内容: 我有以下 我有一个运行一些ajax的函数,然后根据ajax是否成功返回true或false。我从代码的多个位置调用了这个ajax函数。 因为该函数在ajax完成之前结束,所以它总是返回false。如何避免这种情况? 我读到一些建议我在函数中执行的操作,然后将和函数移至我的和函数。但是,在我的方法中,我进行了大量的计算。很多代码。因此,问题在于,如果我将功能移至其他功能,那么我将复制一堆

  • 问题内容: 我有一个简单的功能,可以从Firebase加载数据。 当前,即使有要加载的数据,此函数也会始终返回。之所以这样做,是因为它永远不会执行执行完成块,在函数返回之前,它不会在数组中加载数组。我正在寻找一种使函数仅在调用完成块后才返回的方法,但不能将return放在完成块中。 问题答案: (关于此问题的变化经常出现在SO上。我永远找不到一个好的,全面的答案,因此下面尝试提供这样的答案) 你不

  • 你知道我在这里做错了什么吗?我怎么能让它工作。?!

  • 我对Mono和Flux很陌生。我正在尝试加入几个下游API响应。这是一个传统的阻塞应用程序。我不想收集Mono的列表,我想要一个从下游API返回的有效负载列表,我从Mono获取。然而,有时返回给控制器的“结果”只有部分或没有下游API响应。正确的方法是什么?我读过几篇关于如何迭代通量和混合单态的帖子 您不应该在web应用程序中的任何位置调用subscribe。如果这是绑定到HTTP请求的,则基本上

  • 我对这段代码有一个问题,其中语句是在函数之前触发的,它返回0而不是正确的值。有没有办法在返回之前强制完成?我知道这是一个逻辑问题,因为如果我删除处的注释,它就可以正常工作。 如何在不使用或应用程序中的任何其他类型的超时?原始代码: 编辑代码: 这是StorageInformation类 从接口调用StorageInformation 我还尝试了r2rek的解决方案,得到了相同的结果 欢迎提出任何问

  • 问题内容: 我有一个页面,使用被称为100次(async:true)的jQuery.ajax,问题是,当它们都被加载时,我需要系统等待所有100次调用返回后才能继续。我将如何处理? 提前致谢!:) 更新: 这些调用在for()循环中进行(其中有100个:) 问题答案: 最好的方法是使用。您可以按以下方式使用它: 另外,如果您在数组中拥有所有AJAX调用,则可以使用: 请注意,这至少需要jQuery