首页 文章

哪个CoroutineScope用于Spring Boot WebFlux endpoints

提问于
浏览
0

在Spring Boot WebFlux应用程序中,我们有许多 endpoints (REST和GraphQL),它们返回 MonoFlux 的某些内容 . 这些 endpoints 调用的代码都是非阻塞的,但是我们不想使用reactor,而是想使用Kotlin协程编写所有这些非阻塞代码 . 我们可以使用 kotlinx.coroutines.reactor.mono() 这样的方法将我们的协同程序包装在 Mono 中(以及 Flux 结果的相应 flux() 方法) .

但是,为了调用这些方法,我们首先需要一个 CoroutineScope 来包装整个请求(以及处理诸如取消我们的主要"entry point"协程开始的任何子协同程序之类的事情) . 这里似乎有几种选择 . 例如,我们可以构造一个新的 CoroutineScope 并选择一个调度程序,例如 CoroutineScope(Dispatchers.Default).mono {... . 或者我们可以构造我们自己的类来表示整个HTTP请求,并实现 CoroutineScope ,如here所示,用于Android Activity .

这个问题隐含的是选择要在哪个线程(或线程池)上执行的工作 . 我们可以自己创建一个线程池,但Spring Boot WebFlux已经创建了自己的线程池来处理非阻塞环境中的HTTP请求,所以也许最好还是留在当前线程(或者在该线程池中)?如果这是最好的方法,有没有办法获得该线程池并获得协同程序运行?

1 回答

  • 1

    因为在Spring WebFlux中,HTTP交换并不是特定的线程, GlobalScope.mono(Dispatchers.Unconfined) 可能是最好的选择 .

    请注意 Dispatchers.Unconfined 是一个实验性API,以及将受lazy iterable streams深深影响的Coroutines通道API . 因此,我建议您等待Spring official support for Coroutines获取任何 生产环境 代码 .

相关问题