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

[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框架是如何基于它们,来进行异步请求处理的:


Playing Play!系列之三:不必Servlet3,Play框架的异步请求处理之道_第1张图片

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

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

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

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

 

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


 

 

 

你可能感兴趣的:(应用服务器,框架,struts,servlet,Mina)