Spring MVC 3.2 技术预览(一):Servlet 3介绍,异步支持
原文地址:http://blog.springsource.org/2012/05/06/spring-mvc-3-2-preview-introducing-servlet-3-async-support/
概述:
Spring MVC 3.2 M1将引入基于Servlet 3.0支持的异步请求处理,我将针对Spring MVC 3.2的新特性发布一系列文章,并通过对背景知识和相关内容的充分介绍,让你了解你为什么需要这些新特性,以及如何使用这些新特性。这是这一系列文章中的第一篇。
Spring MVC 3.2的更新内容已经可以在Spring Framework Github中查看,也可以将http://repo.springsource.org/snapshot设置在你的项目仓库中,来获取快照版本。在后面的文章中,我也将提供一些源码示例的链接。但如果你想现在就尝试这些新特性,也可以在GitHub上签出spring-mvc-async中的spring-mvc-showcase项目,并通过提交记录查看其中的更新信息。
惊鸿一瞥:
从编程模型的角度来看,可能会出现看似简单的新功能。现在,控制层(Controller)的方法可以返回Callable类型来完成异步请求的处理。Spring MVC 3.2会在TaskExecutor的帮助下在一个独立的线程中调用这个返回值,可以查看下面这个代码片段:
- @RequestMapping(method=RequestMethod.POST)
- public Callable<String> processUpload(final MultipartFile file) {
- return new Callable<String>() {
- public Object call() throws Exception {
- // ...
- return "someView";
- }
- };
- }
另一种方式,是在控制层(Controller)方法中返回DeferredResult类型(这是Spring MVC 3.2中的新成员),在任意的线程中完成异步处理。例如对一个外部事件(例如JMS信息、AMQP信息、Redis信息等)作出反应,下面是另外一个代码片段:
- @RequestMapping("/quotes")
- @ResponseBody
- public DeferredResult quotes() {
- DeferredResult deferredResult = new DeferredResult();
- // Add deferredResult to a Queue or a Map...
- return deferredResult;
- }
- // In some other thread..
- // Set the return value on the deferredResult
- deferredResult.set(data);
大家肯定对上面的代码片段有很多问题,我会在后面一系列的文章中给出更多的细节信息。在我们深入了解之前,我先介绍一些可能会用到的相关技术背景知识。
长连接请求:
当前一些网络应用最常用的异步处理方式就是长连接方式,例如运行一个缓慢的数据库查询、调用一个外部的REST API或者执行其他I/O操作。这些方式很快就会消耗光Servlet容器的线程池,影响程序的可扩展性。
在一些情况下,你可能需要等待一个处理完成,例如发送邮件、删除数据库操作等。在这种“即发即忘”(fire-and-forget)情况下,你可以使用Spring注解@Async或设置Spring Integration事件并迅速返回,也许还可以返回一个用于确认的ID,为后续的响应所用。这在Spring MVC 3.2之前就可以实现,并且可以避免请求死锁。
对于结果返回之前需要的其他情况下,你需要先释放处理请求的Servlet容器线程来提高程序的可扩展性。为了实现这个功能,Servlet 3允许一个Servlet在返回请求之后声明保持响应为打开状态,这样请求就可以在一个独立线程中完成。
为了实现这个功能,可以调用Servlet 3中的request.startAsync()方法,并使用返回的AsyncContext在一个独立线程内继续写入(并最终完成)响应。这在客户端看来没有任何变化,请求仍然看起来像是其他HTTP标准的“请求—相应”一样。但是,在服务器端看来,异步请求处理可以让你以扩展性更好的方式处理请求。下面就是处理异步请求的事件顺序:
- 客户端发送一个请求
- Servlet容器调用一个Servlet(同时分配一个线程)
- Servlet调用 request.startAsync(),保存并返回 AsyncContext
- Servlet容器的线程被释放,但是响应保持打开状态
- 另一个线程使用保存的 AsyncContext完成响应
- 客户端收到响应信息
关于Servlet对异步请求处理的支持,还有很多内容,你可以找到很多示例和文章(文章被墙了),但是上面总结的这些是所需要的最基本的概念。
总结:
在下一篇文章中,我将介绍第二种异步请求处理的方式:客户端浏览器无延时的实时获取服务器的更新信息。过去已经发展出了很多方式实现这个功能,一些停留在HTTP标准的“请求—相应”的语义环境下,另一些则以更好的方式实现。
Spring MVC 3.2 技术预览(一):Servlet 3介绍,异步支持的更多相关文章
- Windows 10 技术预览版9926 “未知源”引起系统休眠后自启的解决办法
问题的由来: 自从安装上了最新发布的Windows 10 ,使用起来有诸多的改进:无论是重绘的图标还是通知消息中心的整合还是更智能的OneDrive客户端都使得工作起来非常愉悦. 不过笔者这两天频繁遇 ...
- 新的理念、 新的解决方案、 新的Azure Stack技术预览
Jeffrey Snover 我们很高兴地宣布︰Azure Stack Technical Preview 2(TP2)已发布!我们朝着向您的数据中心提供Azure服务能力的目标又更近一步.自发布第一 ...
- Windows 10 技术预览
windows10的技术预览版已经发布了很久了,正式版大约在今年的夏天就会发布,作为微软寄予厚望的下一代全平台操作系统,相比于windows8.1,windows10做了哪些改进,又添加了哪些新功能. ...
- 微软推出首个Microsoft Azure Stack技术预览版
Mike Neil,微软公司企业云副总裁 怀着对于提高业务灵活性.加速创新的期待,很多企业正在向云平台迅速迁移.伴随着这样的趋势,我们也见证了微软智能云Azure业务在全球市场的快速增长--每个月近1 ...
- 熊猫猪新系统测试之一:Windows 10 技术预览版
话说本猫不用windows很多年了呀!不过看到微软最新的Windows10还是手痒了,想安装体验一把.于是第一时间下载,并做成usb引导安装镜像,在08年的老台式机上安装尝鲜鸟.下载ISO和安装方法这 ...
- (转)ASP.NET MVC 第五个预览版和表单提交场景
转自:http://ourlife.blog.51cto.com/708821/296171 上个星期四,ASP.NET MVC开发团队发布了ASP.NET MVC框架的“第五个预览版”.你可以在这里 ...
- 06、Windows 10 技术预览
随着 Windows 10 发布的,未来 Windows 平台都是统一开发模型,可以只写一个 Appx 包,就可以同时部署到 Windows/ Windowsw Phone/ Tablet /xbox ...
- 微软发布Azure Stack第一个技术预览版
为了提升商业灵敏度和加快创新步伐,各个企业都在迅速地转向云服务.在微软,我们已经见到微软智能云Azure的飞速发展和使用,每月我们都有近十万的新增订阅量.然而,我们也了解到还有很多企业在完全移到公有云 ...
- 第07章-Spring MVC 的高级技术
Spring MVC 的高级技术 1. Spring MVC配置的替代方案 1.1 自定义DispatcherServlet配置 AbstractAnnotationConfigDispatcherS ...
- 熊猫猪新系统測试之中的一个:Windows 10 技术预览版
话说本猫不用windows非常多年了呀! 只是看到微软最新的Windows10还是手痒了.想安装体验一把. 于是第一时间下载,并做成usb引导安装镜像,在08年的老台式机上安装尝鲜鸟.下载ISO和安装 ...
随机推荐
- 【Docker教程系列】Docker学习5-Docker镜像理解
通过前面几篇文章的学习,我们已经安装好了Docker,也学会使用一些常用的命令.比如启动命令.镜像命令.容器命令.常用命令分类后的第二个就是镜像命令.那么镜像是什么?拉取镜像的时候为什么是一层一层的? ...
- 【YashanDB知识库】EXP导致主机卡死问题
问题现象 问题单:exp导出全库1主2备主节点执行,DMP文件30G左右系统卡死,发生主备切换 现象: exp sys/Cod-2022 file=bim20240402.dmp full=y 服务器 ...
- JDBC,SQL注入,事务,C3P0于Druid连接池(最详细解析)
JDBC JDBC(Java DataBase Connectivty,Java数据库连接)API,是一种用于执行Sql语句的Java API,可以为关系型数据库提供统一的访问,其由一组Java编写的 ...
- 五子棋AI:实现逻辑与相关背景探讨(下)
前文回顾 在上篇文章中,我们约定了一种衡量格子价值的方式,如下表. 综合价值排序 己方价值 敌方价值 对应的奖励数值 1 Lv1 ? \(2^{20}\) 2 ? Lv1 \(2^{16}\) 3 L ...
- MoCov1: 无监督视觉表征学习的动量对比《Momentum Contrast for Unsupervised Visual Representation Learning》(MoCo、动量对比、动态字典、队列维护、对比损失InfoNCE)
现在是2024年6月11日,21:49,刚找好要看的论文,师兄推荐的. 先占个坑,明天看,我累了(我没脑子了). 现在是6月12日,15:49,干正事了(又被别人影响了情绪,这不好,希望你改掉,好的, ...
- Angular 18+ 高级教程 – Routing 路由 (原理篇)
修改中... 前言 Angular 是 Single Page Application (SPA) 单页面应用,所谓的单页面是站在服务端的角度看,不管游览器请求什么路径,一律返回 index.html ...
- 前端项目通过 Nginx 发布至 Linux,并通过 rewrite 配置访问后端接口
〇.前言 本文通过将 arco 框架的前端项目,部署至 CentOS 7,并访问同服务器的 WebAPI 接口,来简单演示一下,如何将前端项目发布至 Linux 系统. 关于 ASP.NET WebA ...
- 打开word报错“内存或磁盘空间不足,无法显示所请求的字体”
起因: 有一个部门同学在打开服务器上的某个word文档时报错,但是打开本地word文档正常,经过网上查询资料后发现有可能是以下几种原因造成. 可能造成此报错的原因: 1. 文档被锁定 解决办法: 鼠标 ...
- 自我介绍&博客指南&博客更新日志
自我介绍 目前高中在读生 专用网名:Alloverzyt,端木 傲 忍 入站必读: 我所爱之人,敬祝 本人博客及动态免责声明 学历简述:成都市棕北小学,成都市石室联合中学,成都市石室中学 博客指南 本 ...
- Tauri2.0+Vite5聊天室|vue3+tauri2+element-plus仿微信|tauri聊天应用
原创tauri2.0+vue3+pinai2仿QQ/微信客户端聊天Exe程序TauriWinChat. tauri2-vue3-winchat自研vite5+tauri2.0+vue3 setup+e ...