摘要:本部分示例见这个项目的分支下的中引进了基于异步请求处理的。同时主容器线程退出释放并允许处理其他请求。对的调用返回,可以被用于异步处理之上的进一步控制。
本部分示例见这个项目的 mvc 分支下的 AsyncController.java
Spring MVC 3.2 中引进了基于异步请求处理的 Servlet 3。除了返回一个值,一个控制器方法现在可以返回一个java.util.concurrent.Callable并生产来自 Spring MVC 管理的线程的返回值。同时主 Servlet 容器线程退出、释放并允许处理其他请求。Spring MVC 在 TaskExecutor 的帮助下,在一个独立的线程中调用 Callable,当 Callable 返回时,请求被发回 Servlet 容器,使用 Callable 的返回值继续执行。这里有一个这样的控制器方法的例子:
@PostMapping public CallableprocessUpload(final MultipartFile file) { return new Callable () { public String call() throws Exception { // ... return "someView"; } }; }
这个控制器方法的另一个选择是返回一个DeferredResult实例。这种情况下,返回值可以由任何线程产生,比如一个没有被 Spring MVC 管理的线程。比如,结果可能产生于外部事件的响应,比如一个 JMS 消息,一个定时任务等。这里有一个这样的控制器方法的例子:
@RequestMapping("/quotes") @ResponseBody public DeferredResultquotes() { DeferredResult deferredResult = new DeferredResult (); // Save the deferredResult somewhere.. return deferredResult; } // In some other thread... deferredResult.setResult(data);
如果没有任何对 Servlet 3.0 中异步请求处理特性的了解的话,这可能很难理解。去了解一下会很有帮助。这里列出几个这个机制的基本事实:
通过request.startAsync()调用,一个 ServletRequest 可以被置为异步模式。这么做的主要影响是,Servlet,以及任何 Filter,可以退出,但是响应依旧会保持开放来允许之后完成处理过程。
对request.startAsync()的调用返回 AsyncContext,AsyncContext 可以被用于异步处理之上的进一步控制。比如它提供了方法调度功能,这很像 Servlet API 中的 forward,但是它允许应用程序继续在 Servlet 容器线程中进行请求处理。
ServletRequest 提供对当前 DispatcherType 的访问,DispatcherType 可以用于区别处理初始化请求、异步调度、forward 和其他调度器(dispatcher)类型。
有了上面的意识,下面是用于带有 Callable 的异步请求处理的事件序列:
控制器返回一个 Callable
Spring MVC 开始异步处理,并把 Callable 提交给一个 TaskExecutor 用于在一个多带带的线程中处理
DispatcherServlet 和所有的 Filter 退出 Servlet 容器线程,但是响应保持打开
这个 Callable 产生一个结果,Spring MVC 把这个请求调回 Servlet 容器继续处理
DispatcherServlet 继续执行,并继续处理来自 Callable 的异步产生的结果
DeferredResult 的事件序列很相似,除了它应该由应用程序从任何线程中来产生异步结果:
控制器返回一个 DeferredResult,并把它保存在内存中的队列或者列表中用于访问
Spring MVC 开始异步处理
DispatcherServlet 和所有配置的 Filter 退出请求处理线程,但是响应依旧打开
应用程序设置来自一些线程中的 DeferredResult,Spring MVC 把请求调回 Servlet 容器
DispatcherServlet 再次被调用,并继续处理异步产生的结果
要了解更多使用异步请求处理的动机的背景,以及什么时候或为什么使用它,请读这个博客文章系列.
因为所学有限,这一部分并没有真正完成。这里先占坑,日后再行补充。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/66082.html
摘要:本文章是蓝图系列的第一篇教程。是事件驱动的,同时也是非阻塞的。是一组负责分发和处理事件的线程。注意,我们绝对不能去阻塞线程,否则事件的处理过程会被阻塞,我们的应用就失去了响应能力。每个负责处理请求并且写入回应结果。 本文章是 Vert.x 蓝图系列 的第一篇教程。全系列: Vert.x Blueprint 系列教程(一) | 待办事项服务开发教程 Vert.x Blueprint 系...
摘要:也就是说不应该有公开的,所有都应该是私有的,只能有公开的。允许使用方法设置监听函数,一旦发生变化,就自动执行这个函数。用一个叫做的纯函数来处理事件。可以通过得到当前状态。在中,同步的表现就是发出以后,立即算出。 这篇文章试着聊明白这一堆看起来挺复杂的东西。在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎。 不管是Vue,还是 React,都需要管理状态(state),比如组件之...
摘要:中所有的基础类型类等都继承,默认值是,自带和,而如果是或者的话,那么它只有一个方法。断言失败则程序立刻终止检查是否为空字符串检查是否小于等于检查是否为检查是否为字符串中,支持类型。类继承类,通过关键字调用类的构造函数。泛型全面支持泛型。 目录介绍 01.变量声明 1.1 var声明变量 1.2 变量和常量 1.3 dynamic和Object 02.数据类型 2.1 基本...
摘要:摘要的错误监控插件同步支持异步错误监控。此次更新,我们对的监控插件做了相应的更新,来更好地支持使用框架开发的应用错误的监控。程序运行后,成功捕获该错误总结更新到,对错误处理提供了更加强大的支持。 摘要: Fundebug 的 JavaScript 错误监控插件同步支持 Vue.js 异步错误监控。 Vue.js 从诞生至今已经 5 年,尤大在今年 2 月份发布了重大更新,即Vue 2....
阅读 2230·2021-10-09 09:41
阅读 3334·2021-09-13 10:34
阅读 1887·2019-08-30 12:59
阅读 527·2019-08-29 17:27
阅读 1007·2019-08-29 16:07
阅读 2926·2019-08-29 13:15
阅读 1279·2019-08-29 13:14
阅读 1509·2019-08-26 12:18