Spring Boot WebFlux 端点使用哪个 CoroutineScope
Which CoroutineScope to use for Spring Boot WebFlux endpoint
在 Spring Boot WebFlux 应用程序中,我们有许多端点(REST 和 GraphQL),其中 return 是 Mono
或 Flux
的东西。这些端点调用的代码都是非阻塞的,但我们不想使用反应堆,而是希望使用 Kotlin 协同程序编写所有这些非阻塞代码。我们可以使用 kotlinx.coroutines.reactor.mono()
之类的方法将协程包装在 Mono
中(以及 Flux
结果的相应 flux()
方法)。
不过,为了调用这些方法,我们首先需要一个 CoroutineScope
来包装整个请求(并处理诸如取消主 "entry point" 协程启动的任何子协程之类的事情)。这里似乎有几种选择。例如,我们可以构造一个新的 CoroutineScope
并选择一个调度程序,例如CoroutineScope(Dispatchers.Default).mono {...
。或者我们可以构造我们自己的 class 来代表整个 HTTP 请求,并让那个实现 CoroutineScope
,如 here 所示 Android Activity
.
这个问题中隐含的是选择应该在哪个线程(或线程池)上执行工作。我们可以自己创建一个线程池,但是 Spring Boot WebFlux 已经创建了自己的线程池来在非阻塞环境中处理 HTTP 请求,所以最好尝试留在当前线程(或那个线程池)?如果那是最好的方法,有没有办法进入那个线程池并让协程到运行?
由于在SpringWebFlux中,HTTP交换不是针对特定线程的,GlobalScope.mono(Dispatchers.Unconfined)
可能是最好的选择。
请注意,Dispatchers.Unconfined
是一个实验性 API,协程通道 API 将深受 lazy iterable streams. So I would advise you to wait Spring official support for Coroutines 任何生产代码的影响。
在 Spring Boot WebFlux 应用程序中,我们有许多端点(REST 和 GraphQL),其中 return 是 Mono
或 Flux
的东西。这些端点调用的代码都是非阻塞的,但我们不想使用反应堆,而是希望使用 Kotlin 协同程序编写所有这些非阻塞代码。我们可以使用 kotlinx.coroutines.reactor.mono()
之类的方法将协程包装在 Mono
中(以及 Flux
结果的相应 flux()
方法)。
不过,为了调用这些方法,我们首先需要一个 CoroutineScope
来包装整个请求(并处理诸如取消主 "entry point" 协程启动的任何子协程之类的事情)。这里似乎有几种选择。例如,我们可以构造一个新的 CoroutineScope
并选择一个调度程序,例如CoroutineScope(Dispatchers.Default).mono {...
。或者我们可以构造我们自己的 class 来代表整个 HTTP 请求,并让那个实现 CoroutineScope
,如 here 所示 Android Activity
.
这个问题中隐含的是选择应该在哪个线程(或线程池)上执行工作。我们可以自己创建一个线程池,但是 Spring Boot WebFlux 已经创建了自己的线程池来在非阻塞环境中处理 HTTP 请求,所以最好尝试留在当前线程(或那个线程池)?如果那是最好的方法,有没有办法进入那个线程池并让协程到运行?
由于在SpringWebFlux中,HTTP交换不是针对特定线程的,GlobalScope.mono(Dispatchers.Unconfined)
可能是最好的选择。
请注意,Dispatchers.Unconfined
是一个实验性 API,协程通道 API 将深受 lazy iterable streams. So I would advise you to wait Spring official support for Coroutines 任何生产代码的影响。