В приложении Spring Boot WebFlux у нас есть несколько конечных точек (REST и GraphQL), которые возвращают Mono
или Flux
чего-либо.Код, который вызывают эти конечные точки, является неблокирующим, но вместо использования реактора мы хотели бы написать весь этот неблокирующий код с использованием сопрограмм Kotlin.Мы можем использовать метод, такой как kotlinx.coroutines.reactor.mono()
, чтобы обернуть наши сопрограммы в Mono
(и соответствующий flux()
метод для Flux
результатов).
Для вызова этих методов, однако, мысначала нужно CoroutineScope
, чтобы обернуть весь запрос (и обрабатывать такие вещи, как отмена любых дочерних сопрограмм, которые запускает наша главная подпрограмма "точки входа").Кажется, здесь есть несколько вариантов.Например, мы могли бы создать новый CoroutineScope
и выбрать диспетчер, например CoroutineScope(Dispatchers.Default).mono {...
.Или мы могли бы создать наш собственный класс, который представляет весь HTTP-запрос, и иметь тот, который реализует CoroutineScope
, как показано здесь для Android Activity
.
В этом вопросе подразумеваетсяВыбор того, в каком потоке (или пуле потоков) должна выполняться работа.Мы могли бы создать пул потоков сами, но Spring Boot WebFlux уже создал свой собственный пул потоков для обработки HTTP-запросов в неблокирующей среде, поэтому, возможно, лучше попытаться остаться в текущем потоке (или в этом пуле потоков)?Если это лучший способ, есть ли способ получить этот пул потоков и запустить сопрограмму на этом?