Java 在Spring Webflux中组合多个mono
我是webflux的新手,我正在尝试使用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
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
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));