spring-boot - 哪个 CoroutineScope 用于 Spring Boot WebFlux 端点

标签 spring-boot kotlin spring-webflux project-reactor kotlinx.coroutines

在 Spring Boot WebFlux 应用程序中,我们有许多端点(REST 和 GraphQL),它们返回某种东西的 MonoFlux。这些端点调用的代码都是非阻塞的,但我们不想使用 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/

相关文章:

spring - 让 HTTP 端点返回 Flux/Mono 实例而不是 DTO 的好处

java - Spring Boot Thymeleaf 下拉列表选项不显示值

spring-boot - 具有 Geometry 返回类型的 Spring Data 存储库和 native 查询

protocol-buffers - Kotlin 重写 protobuf 类型 toString

Android 应用程序模块中 JUnit 测试中的类的 java.lang.ClassNotFoundException

spring-boot - Spring boot 2 响应式(Reactive) web websocket 与 datarest 冲突

java - 无法在 Spring Boot Test 1.5 中设置运行时本地服务器端口

java - 将通量拆分为两个通量 - 头和尾

使用 kotlin 的 Json 数据

java - 禁用 Spring Boot Web 客户端日志