Spring Kotlin Webapp без Webflux необходимо одновременно выполнять 2 задачи, чтобы получить наилучший результат - PullRequest
1 голос
/ 22 января 2020

Приложение не использует webflux и реактивное программирование, оно использует обычный CrudRepository для подключения к базе данных, для ответа на который требуется некоторое время, и использует WebClient для выполнения запросов к другим службам, но с использованием * Функция 1003 * для получения результата синхронно. Я хочу изменить следующий код, чтобы оба вызова происходили одновременно:

@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, так как в нем много кода для переноса.

1 Ответ

1 голос
/ 27 января 2020

Если вам нужен параллелизм, вы можете использовать сопрограммы kotlin .

Ваш код будет выглядеть следующим образом:

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())
}
...