【发布时间】:2019-04-25 21:52:40
【问题描述】:
在 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 的 here 所示。
这个问题隐含的是选择应该在哪个线程(或线程池)上执行工作。我们可以自己创建一个线程池,但是 Spring Boot WebFlux 已经创建了自己的线程池,用于在非阻塞环境中处理 HTTP 请求,所以也许最好尝试留在当前线程(或那个线程池中)?如果这是最好的方法,有没有办法进入该线程池并让协程在其上运行?
【问题讨论】:
标签: spring-boot kotlin spring-webflux project-reactor kotlinx.coroutines