`

Playing Play!系列之三:不必Servlet3,Play框架的异步请求处理之道

    博客分类:
  • Java
阅读更多

[PS:离上一篇Play系列文章有近两个月了,当初是打算,大概在一、两个月的时间内,完成大致8篇左右的系列的。未料因新工作的安排,现在的时间和空间都不足够,只能断续完成了]

 

去年年底,JavaEE6规范正式发布,其中,新Servlet3规范的最引人注目特性,就是非阻塞的异步请求处理。一些流行的Servlet容器,如Jetty67,包括即将发布的Tomcat7,都已经或准备支持Servlet3特性。

 

在上一章“再见ServletPlay框架的启动”中,已经介绍到,Play框架有两种启动模式,一种是原生启动方式,一种是通过Servlet包装启动方式。其实这两种方式的最大区别,是后者通过符合Servlet的规范方式,提供传统的同步请求处理服务;而前者,则是通过内嵌ApacheMina/AsyncWeb框架,实现了的一套轻量级的、高性能的、异步的HTTP请求处理服务器。它的原生启动方式,首先就抛弃了传统的同步Servlet容器,直接引入了Servlet3规范中定义的异步请求处理模式。相对于Java领域的StrutsSpringMVC等其他一些流行Web框架,这是Play框架的最大不同。

 

前一章介绍了Play框架的初始化:Play.init()。在框架初始化后,接下来做的,就是启动容器了,Play框架通过两个简单的包装类,即实现了一个基础的,基于Mina/AsyncWeb框架的异步HTTP服务器,这两个类就是“服务器类”(play.server.Server)和“HTTP处理器”(play.server.HTTPHandler)。这一点,与其说是Play框架的简明,到不如说是Mina/AsyncWeb框架的易用。

 

Server类中,Play框架启动了一个Mina的服务器实例,并注册AsyncWebHTTP协议过滤器,和一个HTTPHandler实例。在HTTPHandler中,即是进行具体的HTTP请求处理、响应组装的地方。

 

我对MinaAsyncWeb框架并没有什么研究,这里也就不深入往这两个框架里展开了。下面我们来重点来看,Play框架是如何基于它们,来进行异步请求处理的:


1、  HTTP.RequestHTTP.Response,是Play框架对HTTP请求和响应的包装类,用于为应用开发提供请求和响应相关操作,它们实际是对AsyncWebMutableHttpRequestMutableHttpResponse接口的简单重包装。

2、  PlayPluginPlay框架提供的插件机制,让注册的插件,有机会处理原生的请求对象和响应对象。

3、  InvokerPlay框架对Java5线程池的简单包装,用于将(请求)处理对象加入到处理队列中,实现异步的操作调用,而Invoker.Invocation即为该被调用的(请求)处理对象的抽象基类

4、  MinaInvokerInvoker.Invocation的一个具体实现类,它会根据路由配置表,反射调用对应的由应用实现的控制器(Controller和对应的静态处理方法),这部分我们后面会再进一步分析。

 

可以看出,Play框架利用Mina/AysncWeb,加上Java5提供的ScheduledThreadPoolExecutor,并通过一些集成的中间类,即实现了一套完整而高效的异步HTTP服务器框架。简单的实现,诠释出一个深刻的道理,发明新车与发明新的轮子,没什么关系,关键是要能找到合适的轮子,并把它装到合适的位置。


 

 

 

  • 大小: 101 KB
1
1
分享到:
评论
1 楼 wind13 2011-10-28  
研究得比较透彻了,一直都只是在用,正好学习一下深层的理论知识,感谢作者的分享!

相关推荐

    playing-multipartform:在 Play Framework 2.3.8 中处理和测试 MultipartFormData 请求的基本示例

    #Playing MultipartFormData 在 Play Framework 2.3.8 中处理和测试 MultipartFormData 请求的基本示例在 Web 应用程序中上传文件的标准方法是使用具有特殊 multipart/form-data 编码的表单,它允许您将标准表单数据...

    StartPlaying:如果你开始玩......开始新的一年吧! :party_popper::party_popper::party_popper:

    "StartPlaying"是一个基于JavaScript的项目,旨在帮助用户在新年前夜或者其他特殊时刻创建有特色的倒计时,为活动增添乐趣和仪式感。这个项目的名字"StartPlaying"寓意着通过播放精心挑选的剪辑或音乐来开启一个新的...

    play的用法PPT学习教案.pptx

    - **玩,踢**:play作为动词时,它可以指代各种游戏、活动或运动。例如,“She is playing with her toys”意味着她在玩玩具,而“He plays soccer every weekend”表示他每个周末都踢足球。 3. **play与乐器的...

    如何同步或异步播放 Wav声音C#.net源代码编写

    在C#.NET编程环境中,处理音频文件,特别是WAV格式的声音文件,是常见的需求。WAV格式是一种无损音频格式,广泛应用于各种操作系统和应用程序中。本篇文章将深入探讨如何利用C#.NET来同步和异步播放WAV声音,以及...

    A Complete Guide To Playing Badminton.pdf

    这部分将讲述羽毛球的发展历程以及国际羽毛球联合会(IFB)等组织的作用,使学生了解这项运动的文化背景和组织框架。 ### 十一、当前议题 **当前议题(第38页):** 可能涵盖了目前羽毛球界面临的挑战和热点话题,...

    read_and_play_video.rar_matlab play_play

    在MATLAB中,读取和播放视频文件是一项常见的任务,特别是在图像处理和计算机视觉领域。本文将详细讲解如何使用MATLAB来实现这个功能,并结合给定的“read_and_play_video”程序进行分析。 首先,MATLAB提供了...

    playing-slick-pg:适用于PostgreSQL具有Slick扩展的Reactive Play应用程序

    处理异步结果,处理超时 为实现这一目标,期货使用了更多惯用的错误处理。 使用Slick访问JDBC数据库。 实现表分页和排序功能。 带有嵌入式JS和CSS库。 基于Play和Scala的模板引擎实现 与CSS框架集成(Twitter ...

    This guide describes how to create these types of CarPlay apps.

    3. **CarPlay app准则**:开发者需遵循一系列设计和功能准则,以确保应用在CarPlay上的表现符合苹果的安全和用户体验标准。这包括简洁的界面、语音控制支持、以及最小化驾驶者分心的设计原则。 4. **开发环境**:...

    jquery 按钮 play/pause

    在网页交互设计中,jQuery库经常被用于简化JavaScript的DOM操作和事件处理,使得动态效果的实现更加便捷。本主题将深入探讨如何使用jQuery来创建一个具有播放/暂停功能的按钮,通过切换两个图片来直观地展示播放状态...

    猜数游戏 c++源代码

    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

    【标题】"简单易用的play" 指的是在Android平台上实现的音乐播放功能,它为开发者提供了一种简洁且高效的解决方案。在Android应用开发中,音乐播放是常见的需求,用户可以通过这样的功能来享受音乐或者配合应用的...

    python 外观模式(示例)

    - 外观对象对子系统返回的结果进行处理(如果需要),然后将结果返回给客户端。 4. **Python中的实现**: 假设我们有一个复杂的多媒体播放系统,包括音频播放器、视频播放器和DVD驱动器。每个组件都有自己的操作...

    Play.java for Simple Bridge Card Playing Programming

    Play.java for Simple Bridge Card Playing Programming. It's a main java file using javaFX

    Play sound

    此外,如果你想在C#中播放.mp3或其他非.wav格式的音频文件,可能需要借助第三方库,因为.NET Framework默认不支持这些格式。例如,NAudio库就可以处理.mp3文件,只需要添加适当的解码器。 总结来说,C#提供了多种...

    [DirectX]Programming.Role.Playing.Games:GameCore

    DirectX是微软开发的一组应用程序接口(API),用于处理与游戏编程相关的图形、音频和输入设备操作。在“[DirectX]Programming.Role.Playing.Games:GameCore”这个主题中,我们聚焦的是使用DirectX来开发角色扮演...

    node-airplay-js:爆米花时间叉的节点-airplay-js

    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]Programming.Role.Playing.Games:03_Input”专注于DirectX在角色扮演游戏(RPG)中的输入处理部分。输入处理是游戏开发的关键环节,因为它负责接收和解析用户的操作,如键盘、鼠标或游戏手柄...

    一个基于Flask实现的RWKV_Role_Playing项目的API。.zip

    **Flask框架基础** Flask是一个轻量级的Web服务程序,它允许开发者用Python编写应用程序。Flask的核心设计理念是微框架,这意味着它提供基本功能,但允许开发者自由选择库来扩展其功能。在`RWKV_Role_Playing项目`...

    #nowplaying-RS:使用分解机的音乐推荐_R_Python_下载.zip

    在这个名为"#nowplaying-RS:使用分解机的音乐推荐_R_Python_下载.zip"的压缩包文件中,我们可以预见到一个关于音乐推荐系统的项目。这个项目可能是用R语言和Python结合来实现的,利用了分解机(Factorization ...

    情人节程序员用HTML网页表白【浪漫的烟花3D相册】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript

    - **AJAX请求**:实现异步数据交换,更新网页的部分内容而无需刷新整个页面。 - **框架与库**:使用如jQuery、React、Vue等前端框架或库来简化开发流程。 #### 示例代码分析: ```javascript // 示例 JavaScript ...

Global site tag (gtag.js) - Google Analytics