Какой CoroutineScope использовать для конечной точки Spring Boot WebFlux - PullRequest
0 голосов
/ 23 ноября 2018

В приложении 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-запросов в неблокирующей среде, поэтому, возможно, лучше попытаться остаться в текущем потоке (или в этом пуле потоков)?Если это лучший способ, есть ли способ получить этот пул потоков и запустить сопрограмму на этом?

1 Ответ

0 голосов
/ 23 ноября 2018

Так как в Spring WebFlux обмен HTTP не направлен на конкретный поток, GlobalScope.mono(Dispatchers.Unconfined), вероятно, является наилучшим вариантом.

Обратите внимание, что Dispatchers.Unconfined является экспериментальным API, а также API-интерфейсом канала Coroutines, которыйбудут глубоко затронуты ленивые итерируемые потоки .Поэтому я бы посоветовал вам подождать Spring официальной поддержки Coroutines для любого производственного кода.

...