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())
}
该应用程序不使用 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())
}