[PS:离上一篇Play系列文章有近两个月了,当初是打算,大概在一、两个月的时间内,完成大致8篇左右的系列的。未料因新工作的安排,现在的时间和空间都不足够,只能断续完成了]
去年年底,JavaEE6规范正式发布,其中,新Servlet3规范的最引人注目特性,就是非阻塞的异步请求处理。一些流行的Servlet容器,如Jetty6、7,包括即将发布的Tomcat7,都已经或准备支持Servlet3特性。
在上一章“再见Servlet,Play框架的启动”中,已经介绍到,Play框架有两种启动模式,一种是原生启动方式,一种是通过Servlet包装启动方式。其实这两种方式的最大区别,是后者通过符合Servlet的规范方式,提供传统的同步请求处理服务;而前者,则是通过内嵌Apache的Mina/AsyncWeb框架,实现了的一套轻量级的、高性能的、异步的HTTP请求处理服务器。它的原生启动方式,首先就抛弃了传统的同步Servlet容器,直接引入了Servlet3规范中定义的异步请求处理模式。相对于Java领域的Struts、SpringMVC等其他一些流行Web框架,这是Play框架的最大不同。
前一章介绍了Play框架的初始化:Play.init()。在框架初始化后,接下来做的,就是启动容器了,Play框架通过两个简单的包装类,即实现了一个基础的,基于Mina/AsyncWeb框架的异步HTTP服务器,这两个类就是“服务器类”(play.server.Server)和“HTTP处理器”(play.server.HTTPHandler)。这一点,与其说是Play框架的简明,到不如说是Mina/AsyncWeb框架的易用。
在Server类中,Play框架启动了一个Mina的服务器实例,并注册AsyncWeb的HTTP协议过滤器,和一个HTTPHandler实例。在HTTPHandler中,即是进行具体的HTTP请求处理、响应组装的地方。
我对Mina和AsyncWeb框架并没有什么研究,这里也就不深入往这两个框架里展开了。下面我们来重点来看,Play框架是如何基于它们,来进行异步请求处理的:
1、 HTTP.Request和HTTP.Response,是Play框架对HTTP请求和响应的包装类,用于为应用开发提供请求和响应相关操作,它们实际是对AsyncWeb的MutableHttpRequest、MutableHttpResponse接口的简单重包装。
2、 PlayPlugin是Play框架提供的插件机制,让注册的插件,有机会处理原生的请求对象和响应对象。
3、 Invoker是Play框架对Java5线程池的简单包装,用于将(请求)处理对象加入到处理队列中,实现异步的操作调用,而Invoker.Invocation即为该被调用的(请求)处理对象的抽象基类
4、 MinaInvoker是Invoker.Invocation的一个具体实现类,它会根据路由配置表,反射调用对应的由应用实现的控制器(Controller和对应的静态处理方法),这部分我们后面会再进一步分析。
可以看出,Play框架利用Mina/AysncWeb,加上Java5提供的ScheduledThreadPoolExecutor,并通过一些集成的中间类,即实现了一套完整而高效的异步HTTP服务器框架。简单的实现,诠释出一个深刻的道理,发明新车与发明新的轮子,没什么关系,关键是要能找到合适的轮子,并把它装到合适的位置。
- 大小: 101 KB
分享到:
相关推荐
#Playing MultipartFormData 在 Play Framework 2.3.8 中处理和测试 MultipartFormData 请求的基本示例在 Web 应用程序中上传文件的标准方法是使用具有特殊 multipart/form-data 编码的表单,它允许您将标准表单数据...
"StartPlaying"是一个基于JavaScript的项目,旨在帮助用户在新年前夜或者其他特殊时刻创建有特色的倒计时,为活动增添乐趣和仪式感。这个项目的名字"StartPlaying"寓意着通过播放精心挑选的剪辑或音乐来开启一个新的...
- **玩,踢**:play作为动词时,它可以指代各种游戏、活动或运动。例如,“She is playing with her toys”意味着她在玩玩具,而“He plays soccer every weekend”表示他每个周末都踢足球。 3. **play与乐器的...
在C#.NET编程环境中,处理音频文件,特别是WAV格式的声音文件,是常见的需求。WAV格式是一种无损音频格式,广泛应用于各种操作系统和应用程序中。本篇文章将深入探讨如何利用C#.NET来同步和异步播放WAV声音,以及...
这部分将讲述羽毛球的发展历程以及国际羽毛球联合会(IFB)等组织的作用,使学生了解这项运动的文化背景和组织框架。 ### 十一、当前议题 **当前议题(第38页):** 可能涵盖了目前羽毛球界面临的挑战和热点话题,...
在MATLAB中,读取和播放视频文件是一项常见的任务,特别是在图像处理和计算机视觉领域。本文将详细讲解如何使用MATLAB来实现这个功能,并结合给定的“read_and_play_video”程序进行分析。 首先,MATLAB提供了...
处理异步结果,处理超时 为实现这一目标,期货使用了更多惯用的错误处理。 使用Slick访问JDBC数据库。 实现表分页和排序功能。 带有嵌入式JS和CSS库。 基于Play和Scala的模板引擎实现 与CSS框架集成(Twitter ...
3. **CarPlay app准则**:开发者需遵循一系列设计和功能准则,以确保应用在CarPlay上的表现符合苹果的安全和用户体验标准。这包括简洁的界面、语音控制支持、以及最小化驾驶者分心的设计原则。 4. **开发环境**:...
在网页交互设计中,jQuery库经常被用于简化JavaScript的DOM操作和事件处理,使得动态效果的实现更加便捷。本主题将深入探讨如何使用jQuery来创建一个具有播放/暂停功能的按钮,通过切换两个图片来直观地展示播放状态...
Thank you for playing! Press any key to continue . . . Another Sample: CP1200 Guessing Game Written by Lindsay Ward Please enter your bet (up to $100.00): $-20 Your bet is $100.00 Guess a number ...
【标题】"简单易用的play" 指的是在Android平台上实现的音乐播放功能,它为开发者提供了一种简洁且高效的解决方案。在Android应用开发中,音乐播放是常见的需求,用户可以通过这样的功能来享受音乐或者配合应用的...
- 外观对象对子系统返回的结果进行处理(如果需要),然后将结果返回给客户端。 4. **Python中的实现**: 假设我们有一个复杂的多媒体播放系统,包括音频播放器、视频播放器和DVD驱动器。每个组件都有自己的操作...
Play.java for Simple Bridge Card Playing Programming. It's a main java file using javaFX
此外,如果你想在C#中播放.mp3或其他非.wav格式的音频文件,可能需要借助第三方库,因为.NET Framework默认不支持这些格式。例如,NAudio库就可以处理.mp3文件,只需要添加适当的解码器。 总结来说,C#提供了多种...
DirectX是微软开发的一组应用程序接口(API),用于处理与游戏编程相关的图形、音频和输入设备操作。在“[DirectX]Programming.Role.Playing.Games:GameCore”这个主题中,我们聚焦的是使用DirectX来开发角色扮演...
node-airplay是用于Apple的AirPlay远程播放协议的本机javascript客户端库。 安装 从npm: npm intall airplay-js 用法 // remote video var browser = require ( 'airplay-js' ) . createBrowser ( ) ; browser . ...
这个资源包“[DirectX]Programming.Role.Playing.Games:03_Input”专注于DirectX在角色扮演游戏(RPG)中的输入处理部分。输入处理是游戏开发的关键环节,因为它负责接收和解析用户的操作,如键盘、鼠标或游戏手柄...
**Flask框架基础** Flask是一个轻量级的Web服务程序,它允许开发者用Python编写应用程序。Flask的核心设计理念是微框架,这意味着它提供基本功能,但允许开发者自由选择库来扩展其功能。在`RWKV_Role_Playing项目`...
在这个名为"#nowplaying-RS:使用分解机的音乐推荐_R_Python_下载.zip"的压缩包文件中,我们可以预见到一个关于音乐推荐系统的项目。这个项目可能是用R语言和Python结合来实现的,利用了分解机(Factorization ...
- **AJAX请求**:实现异步数据交换,更新网页的部分内容而无需刷新整个页面。 - **框架与库**:使用如jQuery、React、Vue等前端框架或库来简化开发流程。 #### 示例代码分析: ```javascript // 示例 JavaScript ...