zip三种不同类型的mono和Spring Boot的返回响应

wljmcqd8  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(693)

我想异步调用两个webclient。然后等待两个响应,使用一些业务逻辑并返回一些值。下面的代码是我写的简单版本。但是我不确定它是不是好代码。

@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)
}

我试着用 Mono.zip 但我不能像下面那样使用它。

Mono.zip(mono1, mono2, (m1, m2) -> {
    //some login
    return RoomDto.FullInfo(roomInfoList, userListInRoomList, userRoomCap, maxRoomCount)
}

有没有更好的异步等待方法 WebClient 打电话然后返回一些数据?

iqjalb3h

iqjalb3h1#

注意:如果您添加有关错误的详细信息,我可能会修改此答案,因为我只是粗略地猜测您的问题。
zip确实是适合您的用例的操作符。在第二个示例中,语法是java one,因此无法在kotlin中工作,因为:
lambda语法不同(参数应在括号后声明) return 在lambdas中并不意味着从lambda返回。要从lambda返回值,只需在lambda的最后一行中调用该值。
关于官方文档中lambda语法的更多信息
否则,应该让springwebflux处理管道,并将第一个函数的返回值封装在mono中。完成后,您应该能够使用zip运算符:

@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)
            }
}

相关问题