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和安装 ...
随机推荐
- vue中代理解决跨域
跨域是什么 简单的讲就是你在一个地方使用另一个地方的资源,被浏览器给挡下来了,不让不用!当然,它挡下来是有自己理由的:为了安全(╬▔皿▔)╯. 解决跨域 我是用vue开发的,就vue代理模式解决跨域说 ...
- Playwright 源码 BrowserType
playwright-java 的 Browser.BrowserContext.Page 挺好理解的,唯独这厮,就有一丢丢 -- package com.microsoft.playwright; ...
- C# – 6.0, 7.0, 8.0, 9.0 总结
前言 C# 这几年改了好几个版本, 多了许多语法糖,还带有 JavaScript / TypeScript 的味道了. 我觉得随着 blazor 的发展 (想取代前端开发 ?) 那 C# 必然需要更多 ...
- QT原理与源码分析之对象级QT事件过滤器
本文简略介绍了QT原理与源码分析中的QT对象级事件过滤器的自定义过滤函数.对象级事件过滤器的安装过程,以及安装函数的源码实现. 自定义QT事件过滤器的过滤函数的实现: 事件过滤器被调用时执行的函数代码 ...
- 搭建本地nginx-rtmp服务,初体验rtmp推流、拉流
实验环境说明: ubuntu 16.04 进行本实验的前提:需要在ubuntu上搭建好ffmpeg环境,参考我的另一篇博文 ffmpeg编译过程经历的99八十一难 下面开始本文内容 PART1 编译安 ...
- 2024 年 C# 高效开发:精选实用类库
前言 在平时开发中,好的类库能帮助我们快速实现功能,C#有很多封装好的类库. 本文将介绍一些2024年特别受欢迎的C#类库,并分析各自的优点让我们编程写代码变的更轻松.更快捷. 快来看一看有没有大家常 ...
- UsbHostManager解析
UsbHostManager和UsbDeviceManager的区别在于,UsbDeviceManager是将手机作为一个设备,比如手机连上电脑,使用adb.mtp等:而UsbHostManager, ...
- 75.cancat是否会改变原数组
cancat 用来链接 2 个数组,不会改变原数组 :
- PCI-5565反射内存卡
PCI-5565反射内存卡是一种用于实时网络的硬件设备.它基于反射内存网的原理,通过光纤连接多台计算机,形成网络节点,并且每个节点上的网络内存卡存储着其他节点的共享数据拷贝.该反射内存卡可以插在多种总 ...
- BottomNavigation
BottomNavigation 导航布局navigation.xml <?xml version="1.0" encoding="utf-8"?> ...