Spring 没有 Webflux 的 Kotlin Webapp 需要同时执行 2 个任务才能产生结果的最佳方式

Spring Kotlin Webapp without Webflux need to perform 2 tasks concurrently to yield a result best way

该应用程序不使用 webflux 和响应式编程,它使用正常的 CrudRepository 连接到有时需要很长时间才能响应的数据库,并使用 WebClient 执行请求到其他服务,但使用 block() 函数以同步方式获取结果。我想更改以下代码,以便两个调用同时发生:

@Service class CustomerService(
    val profileClient: WebClient,
    val customerRepository: CustomerRepository
) {

    fun getCustomer(id: String) : CustomerData {
        val customer = customerRepository.findById(id)
        val profile  = profileClient.get().uri("/v1/profile/{id}", id)
                           .retrieve().bodyToMono<Profile>()
                           .block()
        return CustomerData(customer, profile)
    }

}

如果调用 customerRepository.findById(id) 需要 20 毫秒,而 profileClient.get.. 需要 50 毫秒,那么整体需要 70 毫秒,而如果我同时调用这两个调用,则应该需要大约 50毫秒。

我无法使用 Webflux 将应用程序迁移到完全响应式版本,因为它有很多代码要迁移。

如果需要并发,可以使用kotlin's coroutines

您的代码如下所示:

fun getCustomer(id: String) : CustomerData = runBlocking {
    val customer = async { customerRepository.findById(id) }
    val profile  = async { profileClient.get().uri("/v1/profile/{id}", id)
                       .retrieve().bodyToMono<Profile>()
                       .block() }
    CustomerData(customer.await(), profile.await())
}