处理Callable,CompletableFuture和Flux

时间:2017-10-12 21:51:35

标签: spring spring-mvc spring-webflux

从春季开始,看起来Flux / Mono也可以作为弹簧控制器方法的返回值。 我查看了春季参考指南4.3并阅读了一个非常好的描述如何处理Callable和DeferredResult(https://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-ann-async) 我还在一些博客文章中读到,CompletableFuture也可以从控制器方法返回。如果它是真的,那么任何人都可以解释如何 在Spring MVC中处理CompletableFuture和Flux / Mono? 它们的处理方式与DeferredResult / Callable的处理方式相同,即"处理"在外部线程中完成然后Spring MVC将请求调度回DispatcherServlet(因此HTTP响应被写入并在servlet容器线程上刷新)

2 个答案:

答案 0 :(得分:0)

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

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

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

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

the reference documentation中的更多内容。

答案 1 :(得分:0)

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