在 Spring Boot WebFlux 应用程序中,我们有许多端点(REST 和 GraphQL),它们返回某种东西的 Mono
或 Flux
。这些端点调用的代码都是非阻塞的,但我们不想使用 react 堆,而是希望使用 Kotlin 协同程序编写所有这些非阻塞代码。我们可以使用诸如 kotlinx.coroutines.reactor.mono()
之类的方法将协程包装在 Mono
中(以及相应的 flux()
Flux
结果的方法)。
不过,为了调用这些方法,我们首先需要一个 CoroutineScope
来包装整个请求(并处理诸如取消我们的主要“入口点”协程启动的任何子协程之类的事情)。这里似乎有几种选择。例如,我们可以构造一个新的 CoroutineScope
并选择一个调度程序,例如CoroutineScope(Dispatchers.Default).mono {...
。或者我们可以构造我们自己的类来表示整个 HTTP 请求,并让该类实现 CoroutineScope
,如 here 所示。对于 Android Activity
。
这个问题中隐含的是选择应该在哪个线程(或线程池)上执行工作。我们可以自己创建一个线程池,但是 Spring Boot WebFlux 已经创建了自己的线程池来在非阻塞环境中处理 HTTP 请求,所以也许最好尝试留在当前线程(或那个线程池)中?如果这是最好的方法,是否有办法进入该线程池并让协程在其上运行?
最佳答案
由于在 Spring WebFlux 中,HTTP 交换不是针对特定线程的,GlobalScope.mono(Dispatchers.Unconfined)
可能是最好的选择。
请注意,Dispatchers.Unconfined
是一个实验性 API,以及将深受 lazy iterable streams 影响的协程 channel API。 .所以我建议你等一下Spring official support for Coroutines对于任何生产代码。
关于spring-boot - 哪个 CoroutineScope 用于 Spring Boot WebFlux 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53444069/