SpringMVC中异步处理的几种方式

  • 时间:
  • 浏览:1
  • 来源:大发5分排列5_极速5分排列3

     在这里一切的一切还时要通过源代码来解释:

{@code DeferredResult} provides an alternative to using a {@link Callable} for asynchronous request processing. While a {@code Callable} is executed concurrently on behalf of the application, with a {@code DeferredResult} the application can produce the result from a thread of its choice.

     将Controller返回的DeferredResult值保存到内存队列或集合当中,紧接着SpringMVC调用HttpServletRequeststartAsync()依据,与此共同DispatcherServlet和所有配置的Filter退出当前的请求多tcp连接 (不过响应时开放的),当这种 多tcp连接 里设置DeferredResult的值时将重新发送请求,此时DispatcherServlet使用异步生成的返回值继续防止。

     在这里首先派发所有配置好的DeferredResultProcessingInterceptor ,或者 设置asyncRequest的超时防止,完成时的防止等,共同会分阶段执行拦截器中的各个依据。在这里真的佩服Spring框架的扩展机制做的嘴笨 是太好了。最后亲戚亲戚这种 人关注一下如下代码:

DeferredResult processing:

     亲戚亲戚这种 人可否 在其父类ServletRequestAttributes里找到对应的实现:

     使用Callable作为返回值来实现异步与DeferredResult类事 ,亲戚亲戚这种 人先看一看官网描述的具体流程:

根据官网描述:

     当在规定时间内访问http://localhost:200200/take 时,则能成功显示结果:

     其最终还是要调用AsyncWebRequest接口中的dispatch依据进行转发,让DispatcherServlet重新防止异步结果:

     嘴笨 在这里全部前会封装自HttpServletRequest的异步操作,亲戚亲戚这种 人可否 看一下StandardServletAsyncWebRequest的类底部形态图:

     最后我在贴出一段StandardServletAsyncWebRequest 代码,亲戚亲戚这种 人就应该知道整个异步是如何执行的了:

     根据文档说明DeferredResult可否 替代Callable来进行异步的请求防止。只不过这种 类可否 从这种 多tcp连接 里拿到对应的结果。当使用DeferredResult,亲戚亲戚这种 人可否 将DefferedResult的类型并将其保存到可否 获取到该对象的地方,比如说队列但是集合当中,而是我 方便其它多tcp连接 都可否取到并设置DefferedResult的值。

     控制器可否 不必同的多tcp连接 异步生成返回值,类事 响应结构事件(JMS消息)、计划任务等,这样在这里我先使用另外三个 请求来模拟这种 过程

     此时亲戚亲戚这种 人启动tomcat,先访问地址http://localhost:200200/quotes ,此时亲戚亲戚这种 人会看到发送的请求但是等候响应遭到了阻塞:

     亲戚亲戚这种 人先定义三个 Controller,代码内容如下:

     DeferredResult这种 类代表延迟结果,亲戚亲戚这种 人先看一看spring的API文档给亲戚亲戚这种 人的解释:

     在这里亲戚亲戚这种 人关注handleReturnValue的依据,在经过适配包装后获取DeferredResult开启了异步之旅

Callable processing:

     流程上大体与DeferredResult类事 ,只不过Callable是由TaskExecutor来防止的,而TaskExecutor继承自java.util.concurrent.Executor。亲戚亲戚这种 人来看一下它的源代码,它也是在WebAysncManager中防止的:

     对比DeferredResult,在这里刚开始也是去掉 拦截器,只不过拦截器的名称是CallableProcessingInterceptor ,共同也时要设置WebAsyncRequest的超时防止,完成时防止的响应操作。这其中最大的区别而是我使用TaskExecutor来对Callable进行异步防止

     关于异步的好处我在这里就太大说了,自从servlet3.1规范发布以来,控制层的异步防止也太大的被人提及。而Spring5的webflux诞生也原应分析Spring全方位对异步提供了支持。嘴笨 早在SpringMVC3.2版本就开始支持异步了,这样这篇文章亲戚亲戚这种 人就来探讨一下SpringMVC使用异步的依据。