Quarkus: выполнить параллельный unis
В приложении quarkus / kotlin я хочу запускать несколько запросов к базе данных одновременно. Я новичок в quarkys и не уверен, что все делаю правильно:
val uni1 = Uni.createFrom().item(repo1).onItem().apply { it.request() }
val uni2 = Uni.createFrom().item(repo2).onItem().apply { it.request() }
return Uni.combine().all()
.unis(uni1, uni2)
.asTuple()
.onItem()
.apply { tuple ->
Result(tuple.item1, tuple.item2) }
.await()
.indefinitely()
Будет ли
request()
неужели параллельно производиться? Правильно ли это делать в кваркусе?
1 ответ
Решение
Да, ваш код правильный.
Uni.combine().all()
запускает все переданные Unis одновременно. Вы получите кортеж (содержащий отдельные результаты), когда все Unis завершатся (выдадут результат).
Из своего кода вы можете удалить шаг кортежа и использовать
combineWith
вместо.
Наконец, обратите внимание, что
await().indefinitely()
блокирует вызывающий поток навсегда, если один из Uni не завершается (по какой-либо причине). Я настоятельно рекомендую использовать
await().atMost(...)