Reactive Types

    Spring MVC 支持在控制器中使用反应式客户端库(请阅读 WebFlux 部分的反应式库)。这包括来自 spring-webflux 的 WebClient 和其他,如 Spring Data 的反应式数据存储库。在这种情况下,能够从控制器方法中返回反应式类型是很方便的。

    反应式返回值的处理方式如下:

    • 一个单值的承诺是适应的,类似于使用 DeferredResult。例子包括 Mono(Reactor)或 Single(RxJava)。
    • 一个具有流媒体类型(如 application/x-ndjson 或 text/event-stream)的多值流被适应,类似于使用 ResponseBodyEmitter 或 SseEmitter。例子包括 Flux(Reactor)或 Observable(RxJava)。应用程序也可以返回 Flux<ServerSentEvent>Observable<ServerSentEvent>

    一个具有任何其他媒体类型(如 application/json)的多值流是适应的,类似于使用 DeferredResult<List<?>

    :::info Spring MVC 通过 spring-core 的 ReactiveAdapterRegistry 支持 Reactor 和 RxJava,这让它可以适应多个反应式库。 :::

    对于流向响应,支持 reactive back pressure,但对响应的写入仍然是阻塞的,并通过 配置 的 TaskExecutor 在一个单独的线程上运行,以避免阻塞上游源(如从 WebClient 返回的 Flux)。默认情况下,SimpleAsyncTaskExecutor 被用于阻塞性写入,但这在负载下并不合适。如果你打算用一个反应式类型的流,你应该使用 MVC 配置来配置一个任务执行器。