Java 在Spring Webflux中组合多个mono

Java 在Spring Webflux中组合多个mono,java,spring-boot,spring-webflux,project-reactor,Java,Spring Boot,Spring Webflux,Project Reactor,我是webflux的新手,我正在尝试使用Flux执行多个monos。但我认为我做错了。。这是执行多个Mono并将其收集到列表中的最佳方法吗 这是我的密码: mainService.getAllBranch() .flatMapMany(分支列表->{ List branchesList2=(List)branchesList.getData(); List trxMonoList=newarraylist(); branchesList2.stream().forEach(分支->{ 添加(ma

我是webflux的新手,我正在尝试使用
Flux
执行多个monos。但我认为我做错了。。这是执行多个
Mono
并将其收集到列表中的最佳方法吗

这是我的密码:

mainService.getAllBranch()
.flatMapMany(分支列表->{
List branchesList2=(List)branchesList.getData();
List trxMonoList=newarraylist();
branchesList2.stream().forEach(分支->{
添加(mainService.getAllTrxByBranchId(branch.branchId));
});
返回Flux.concat(trxMonoList);//combineAllist();
接口维护服务{
Mono getAllBranch();
Mono getAllTrxByBranchId(String branchId);//将返回执行的url ex:http://trx.com/{branchId}
}
到目前为止,使用上述代码,我可以这样解释:

  • 获取所有分支
  • 迭代所有
    分支列表2
    并将其添加到
    trxMonoList
  • return
    Flux.concat
    ,这就是我不确定这是不是正确的方法的地方。但它正在工作
  • 合并所有列表

  • 我只是搞不清楚,这是在我的上下文中使用通量的正确方法吗?还是有更好的方法来实现我正在尝试做的事情?

    您需要重构一点代码以使其反应

     mainService.getAllBranch()
            .flatMapMany(branchesList -> Flux.fromIterable(branchesList.getData())) (1)
            .flatMap(branch -> mainService.getAllTrxByBranchId(branch.branchId))    (2)
            .collectList()
            .flatMap(resultList -> combineAllList());
    
    1) 从列表中创建分支流量

    2) 遍历每个元素并调用服务


    你不应该在Reactor中使用Stream API,因为它有相同的方法,但对多线程进行了调整和优化。

    这里真正的问题是,你不应该在
    通量中多次点击
    Mono
    。这会给你带来问题。如果你在设计API,你应该解决这个问题,做你想做的事情你需要一种正确的反应方式

    interface MainService{
            Flux<Branch> getAllBranch();
            Flux<Transaction> getAllTrxByBranchId(Flux<String> branchIds);
    }
    

    您所指出的(2)似乎不像您所说的那样有效。它没有遍历每个元素并调用服务。它只执行了一次。您可以将log()操作符添加到操作符的链中吗?我刚刚再次检查了它,结果表明,当我添加
    mainService.getAllTrxByBranchId(branch.branchId)
    .zipWith(cookie)时我只得到一个列表。那么我如何将我的cookie与branchList一起传递呢?我已经尝试了
    concateWith
    ,但我不知道如何做。好了,现在问题解决了。从大约
    zipWith
    “也就是说,等待这两者发出一个元素,并将这些元素组合成一个元组2。”这就是为什么我只收到列表中的第一个元素。
    mainService.getAllTrxByBranchId(mainService.getAllBranch().map(Branch::getId));