【问题标题】:handling Callable, CompletableFuture and Flux处理 Callable、CompletableFuture 和 Flux
【发布时间】:2018-03-24 23:18:00
【问题描述】:

从 spring 5 开始,Flux/Mono 似乎也可以是 spring rest 控制器方法的返回值。 我查看了 spring 参考指南 4.3 并阅读了关于如何处理 Callable 和 DeferredResult 的非常好的描述(https://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-ann-async) 我还在一些博客文章中读到 CompletableFuture 也可以从控制器方法返回。如果这是真的,那么任何人都无法阐明如何 CompletableFuture 和 Flux/Mono 在 Spring MVC 中处理? 它们的处理方式是否与 DeferredResult/Callable 的处理方式不同,即“处理”在外部线程中完成,然后 Spring MVC 将请求分派回 DispatcherServlet(因此 HTTP 响应被写入并在 servlet 容器线程上刷新)

【问题讨论】:

    标签: spring spring-mvc spring-webflux


    【解决方案1】:

    确实,从 Spring Framework 5.0 开始,Spring MVC 可以在控制器处理程序中处理类似 Publisher 的返回类型。根据返回类型的基数(一个或多个可能的值?),Spring MVC 将处理它:

    • 如果返回单个值,则为 DeferredResult
    • DeferredResult<List<?>> 如果它返回一个异步集合,则收集列表中的所有元素
    • ResponseBodyEmitterSseEmitter(如果您将数据流式传输到客户端)

    现在底层处理模型使用 Servlet 3.0 异步支持,将阻塞 I/O 操作移至非容器线程,完成后分派回容器。

    另一方面,Spring WebFlux 是完全异步和非阻塞的(使用 Servlet 3.1 对 Servlet 容器的支持);在这种情况下,将使用更少的线程。

    the reference documentation 中的更多信息。

    【讨论】:

    • 非常感谢。基于docs.spring.io/spring-framework/docs/current/… 的最后一段,这是否意味着 Spring MVC 使用 SyncTaskExecutor 写入 ServletResponseOutputStream (不阻塞“事件循环线程”),但同时这个特定的执行器不能用于生产?所以在 spring mvc 中,如果我想使用响应式类型作为控制器返回方法,我应该显式配置 MVC TaskExecutor 吗?为什么在 Spring 4.3 中不需要为 DeferredResult 配置 MVC TaskExecutor?
    【解决方案2】:

    这个视频很好地解释了 spring mvc https://www.infoq.com/presentations/servlet-reactive-stack 中发生了什么。只需startAsync 用于恢复(调度)到 servlet 线程以写入(以阻塞方式)到 servlet 响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      相关资源
      最近更新 更多