gpt4 book ai didi

spring-boot - 如何并行调用多个Spring Webclient并等待结果?

转载 作者:行者123 更新时间:2023-12-02 12:35:50 24 4
gpt4 key购买 nike

我是 Reactive 编程的新手,我想并行调用两个 API 并处理结果并返回一个简单的数组或项目列表。

我有两个函数,一个返回一个 Flux,另一个返回一个 Mono,我根据那个 Mono 的结果对 Flux 发出的项目做了一个非常简单的过滤逻辑。

我尝试使用 zipWith,但无论采用何种过滤逻辑,只有一个项目到达了最后。我也尝试过 block 但在 Controller 内部不允许这样做:/

@GetMapping("/{id}/offers")
fun viewTaskOffers(
@PathVariable("id") id: String,
@AuthenticationPrincipal user: UserPrincipal
) : Flux<ViewOfferDTO> {
data class TaskOfferPair(
val task: TaskDTO,
val offer: ViewOfferDTO
)

return client.getTaskOffers(id).map {
it.toViewOfferDTO()
}.zipWith(client.getTask(id), BiFunction {
offer: ViewOfferDTO, task: TaskDTO -> TaskOfferPair(task, offer)
}).filter {
it.offer.workerUser.id == user.id || it.task.creatorUser == user.id
}.map {
it.offer
}
}
  • getTaskOffers 返回 OfferDTO
  • 的 Flux
  • getTask 返回 TaskDTO
  • 的 Mono

如果您不能回答我的问题,请至少告诉我如何并行执行多个 API 调用并在 WebClient 中等待结果

最佳答案

这是一个并行调用的用例。

public Mono<UserInfo> fetchCarrierUserInfo(User user) {
Mono<UserInfo> userInfoMono = fetchUserInfo(user.getGuid());
Mono<CarrierInfo> carrierInfoMono = fetchCarrierInfo(user.getCarrierGuid());

return Mono.zip(userInfoMono, carrierInfoMono).map(tuple -> {
UserInfo userInfo = tuple.getT1();
userInfo.setCarrier(tuple.getT2());
return userInfo;
});
}

这里:

  • fetchUserInfo 进行 http 调用以从另一个服务获取用户信息并返回 Mono
  • fetchCarrierInfo 方法进行 HTTP 调用以从另一个服务获取 carrierInfo 并返回 Mono
  • Mono.zip() 将给定的 monos 合并到一个新的 Mono 中,当所有给定的 Monos 都生成一个项目时,该 Mono 将完成,并将它们的值聚合到一个 Tuple2 中。

然后调用fetchCarrierUserInfo().block()得到最终结果。

关于spring-boot - 如何并行调用多个Spring Webclient并等待结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56467836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com