压缩三种不同类型的Mono,并在Spring Boot中返回响应
我想进行两个异步webclient调用。 然后等待两个响应,使用一些业务逻辑并返回一些值。 下面的代码是我所写内容的简单版本。 然而,我不确定它是否是好代码压缩三种不同类型的Mono,并在Spring Boot中返回响应,spring,kotlin,Spring,Kotlin,我想进行两个异步webclient调用。 然后等待两个响应,使用一些业务逻辑并返回一些值。 下面的代码是我所写内容的简单版本。 然而,我不确定它是否是好代码 @RequestMapping(value = ["/{userId}"], method = [RequestMethod.GET]) fun getRoomList(@PathVariable("userId") userId: String): RoomDto.FullInfo {
@RequestMapping(value = ["/{userId}"], method = [RequestMethod.GET])
fun getRoomList(@PathVariable("userId") userId: String): RoomDto.FullInfo {
val countDownLatch = CountDownLatch(2)
val roomPriceSumListMono = Room.getRoomPriceSumMono(webClient, roomPriceSumDto) //remote call
roomPriceSumListMono.subscribe {
//some logic
countDownLatch.countDown()
}
val userListInRoomListMono = roomService.getUserListInRoomListMonoFromRemote(webClient, userIdListInRoomList) //remote call
var userListInRoomList: List<List<UserDto.Info>>? = null
userListInRoomListMono.subscribe{
//some logic
countDownLatch.countDown()
}
countDownLatch.await()
return RoomDto.FullInfo(roomInfoList, userListInRoomList, userRoomCap, maxRoomCount)
}
是否有更好的方法等待async
WebClient
调用,然后返回一些数据?注意:如果您添加有关错误的详细信息,我可能会修改此答案,因为我只是粗略地猜测您的问题
对于您的用例,Zip确实是正确的操作符。在第二个示例中,语法为java one,因此无法在Kotlin中使用,因为:
return
在lambdas中并不意味着从lambda返回。要从lambda返回值,只需在lambda的最后一行调用该值@RequestMapping(value = ["/{userId}"], method = [RequestMethod.GET])
fun getRoomList(@PathVariable("userId") userId: String): Mono<RoomDto.FullInfo> {
val roomPriceSumListMono = Room.getRoomPriceSumMono(webClient, roomPriceSumDto)
val userListInRoomListMono = roomService.getUserListInRoomListMonoFromRemote(webClient, userIdListInRoomList)
return roomPriceSumListMono
.zipWith(userListInRoomListMono) {
roomPriceList, userListInRoomList ->
RoomDto.FullInfo(roomInfoList, userListInRoomList, userRoomCap, maxRoomCount)
}
}
@RequestMapping(值=[“/{userId}]”,方法=[RequestMethod.GET])
有趣的getRoomList(@PathVariable(“userId”)userId:String):Mono{
val roomPriceSumListMono=Room.getRoomPriceCallo(网络客户端,roomPriceSumDto)
val userListInRoomListMono=roomService.getUserListInRoomListMonoFromRemote(webClient,userIdListInRoomList)
返回房间价格表
.zipWith(userListInRoomListMono){
roomPriceList,userListInRoomList->
RoomDto.FullInfo(roomInfoList、userListInRoomList、userRoomCap、maxRoomCount)
}
}
谢谢您的回答。我现在很忙,所以我没有测试您的代码,但我认为这很有帮助。似乎应该删除lambda表达式中的括号<代码>删除括号后返回roomPriceSumListMono.zipWith(userListInRoomListMono){roomPriceList,userListInRoomList->RoomDto.FullInfo(roomInfoList,userListInRoomList,userRoomCap,maxRoomCount)}。谢谢。哦,对不起。修好了。很高兴听到它解决了你的问题。没问题。我不知道kotlin中的lambda语法与java不同。你救了我一天。再次感谢。
@RequestMapping(value = ["/{userId}"], method = [RequestMethod.GET])
fun getRoomList(@PathVariable("userId") userId: String): Mono<RoomDto.FullInfo> {
val roomPriceSumListMono = Room.getRoomPriceSumMono(webClient, roomPriceSumDto)
val userListInRoomListMono = roomService.getUserListInRoomListMonoFromRemote(webClient, userIdListInRoomList)
return roomPriceSumListMono
.zipWith(userListInRoomListMono) {
roomPriceList, userListInRoomList ->
RoomDto.FullInfo(roomInfoList, userListInRoomList, userRoomCap, maxRoomCount)
}
}