`
taojingrui
  • 浏览: 67561 次
  • 来自: ...
社区版块
存档分类
最新评论

Servlet3.0新功能: 异步处理

阅读更多

J2EE 6和Glassfish 3V正式发布了,J2EE 6正式发布了Servlet3.0, 为了能更好的对WEB2.0提供支持, 3.0添加了异步处理的机制.

 

HTTP1.1相对于HTTP1.0的影响 .

 

HTTP1.1最大的一个改变就是提供了长连接,这样HTTP不再是一次请求,一次连接的协议了,只要HTTP的connection不关闭,一次HTTP连接可以支持任意多次request/reponse处理. 当WEB Client与WEB Server建立连接时,客户端可以采用长连接,也就是说Client会一直保持对WEB Server的连接(例如:Browser对一个网站保持当连接,知道Browser关闭或最终退出该网站). 旧的WEB Server会为每一个Http连接分配一个active的Thread,这样当Client的数量增大时,Server端Thread Pool的最大容量也需要相应增大,但Thread是相当耗内存的,一个不小心就会导致Server端NotEnoughMemory...

 

基于HTTP1.1,大部分支持Servlet2.X的WEB容器都采用的NIO去接收和处理请求. 当Client和Server端建立连接时,Server端并不分配一个Thread给HTTP连接.直到Server端收到Client端发送的Request时, Server才开始为该Request分配Thread(注意:这里不是为HTTP连接分配Thread ).

 

这样当大量的Client建立长连接与Server进行交互时,Server无需维持一个Thread给inactive的HTTP长连接, 每个Servlet在doReceived()时其实对应的是一个active Request,而不是HTTPConnection本身. 这样Server端所需的最大Thread数大大地减少了.

 

AJAX的影响

 

1. Request的数量爆炸性增加增加

 

过去WEB Browser打开一个Web page,只需要和Web Server端建立一个HTTP连接.但AJAX技术出现以后,一个Web page上可能有多个与Web Server的连接,而且Ajax request通常是十分频繁的,Server接收到的Request数量大大增长了, 这样原先NIO的技术已经不能很好的支持基于Ajax的服务了.

 

Servlet 3.0的异步处理就能够解决上面的问题.

 

Servlet3.0的solution:

当request发送到Server端时,servlet的doReceived()将request放进一个queue里,然后doReceived结束.这个时候server并没有关闭response,Client端一直在等server端response的内容. Server端维护自己的ThreadPool,当ThreadPool里有idle的Thread,就从queue里取出一个request,分配idle的Thread给request,并进行处理.

 

   @WebServlet("/test" asyncSupported=true)
   public class MyServlet extends HttpServlet {
       ScheduledThreadPoolExecutor executor = null;

        public void init(ServletConfig arg0) throws ServletException {
                   executor = new ThreadPoolExecutor(10);//独立的线程池处理请求
        }
        public void doGet(HttpServletRequest req, HttpServletResponse res) {
            ...
            AsyncContext aCtx = request.startAsync(req, res);
            executor.execute(new AsyncWebService(aCtx));//异步处理
        }
   }

   public class AsyncWebService implements Runnable {
        AsyncContext ctx;
        public AsyncWebService(AsyncContext ctx) {
            this.ctx = ctx;
        }
        public void run() {//处理请求
            //Do something here ...

            // Dispatch the request to render the result to a JSP.
            ctx.dispatch("/render.jsp");
   }
}

 以上的例子可以用于处理对Ajax的请求,因为通常Ajax的请求多,但对响应速度的要求并不太高. 对于正常的页面请求,要求一定的响应速度,可以沿用以前Servlet同步的实现.

 

2. Server端推送信息

在Web2.0的应用中, Ajax可用通过不断的发送Request来获取Server端某种信息的变化,但这种实现会产生大量的Client请求. 当前推荐的方法是,让Server端自己推送信息变化给Client.

 

因为Servlet3.0提供了异步处理的方式, Request提交给Server以后, Server可以为Request注册一个Listener,由Listener去monitor信息的变化,当信息发生变化时,由Listener负责把信息变化发送给Cient(Listener关闭HTTP response).

 

7
0
分享到:
评论
2 楼 b_l_east 2012-11-12  
学习了。
推送部分可以写的更详细点。
1 楼 yiyu 2011-07-28  
嗯,明白了,谢谢

另外我试了一下,现在正式的WebServlet好像改成了
@WebServlet(urlPatterns={"/test"}, asyncSupported=true)

相关推荐

    servlet 3.0新增功能详解

    本文将详细介绍 Servlet 3.0 的关键新特性,包括异步处理、新增的注解支持以及可插性支持等方面。 #### 异步处理支持 异步处理是 Servlet 3.0 中最为显著的新特性之一。这一特性解决了传统 Servlet 在处理长时间...

    servlet3.0.jar下载

    2. **异步处理**:Servlet 3.0引入了异步Servlet的概念,允许Servlet在处理请求时返回控制权给容器,然后在准备好响应时再重新获取控制权。这提高了性能,因为线程可以在等待I/O操作完成时被重用,而不是阻塞等待。 ...

    servlet3.0.zip

    这个压缩包“servlet3.0.zip”包含两个核心的JAR文件:“javax.servlet-javadoc.jar”和“javax.servlet.jar”,它们分别提供了Servlet API的文档和实现。 1. **Servlet API**: - `javax.servlet`包是Servlet API...

    Servlet 3.0jar包和source包

    2. **异步处理**:Servlet 3.0引入了异步处理能力,允许Servlet在处理请求时启动一个后台线程,从而提高服务器性能。通过实现`AsyncContext`接口,开发者可以控制请求的生命周期,直到准备好返回响应。 3. **...

    servlet 3.0 jar 包综合下载

    下载的`servlet3.0jar综合`压缩包包含了实现这些特性的关键库,对于进行Java EE 3.0开发的程序员来说是必不可少的工具。在实际开发中,结合相关的框架(如Spring MVC)和其他Java EE组件,可以构建出功能强大、易...

    servlet3.0推送聊天室

    Servlet 3.0作为Servlet规范的一个重要版本,引入了许多新特性,其中最引人注目的就是异步处理和支持Web插座(WebSocket),这使得实时通信如聊天室的实现变得更加便捷。本文将深入探讨如何利用Servlet 3.0的异步...

    maven servlet 3.0 eclipse config video

    而Servlet 3.0是Java EE 6的一部分,引入了许多新功能,如注解配置、异步处理和过滤器链的增强。 **Maven配置** 1. **安装Maven**: 首先,你需要下载并安装Apache Maven到你的系统中,确保将其路径添加到系统环境...

    servlet3.0-demo

    总结起来,"servlet3.0-demo"项目展示了Servlet 3.0的关键特性,包括使用注解声明Servlet、处理文件上传以及异步处理。这些改进极大地提升了开发效率,使得Servlet API更加现代化和易于使用。通过学习这个示例,...

    Servlet3.0 异步处理 页面推送 Comet 实例

    Servlet3.0是Java EE平台中的一个重要更新,它引入了许多新特性,其中一项重大改进就是对异步处理的支持。这项特性使得服务器可以处理长时间运行的任务,而不会阻塞其他请求,提高了系统的响应能力和效率。本实例...

    Servlet3.0特性详解

    Servlet3.0是Java EE平台中的一个重要组成部分,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。以下是对Servlet3.0主要特性的详细解释: 1. **注解配置**: 在Servlet3.0中,我们可以...

    servlet3.0相关的包

    Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。在这个"Servlet3.0相关的包"中,包含了以下几个关键组件: 1. **Servlet**: 这是Java ...

    Servlet3.0 Demo

    Servlet3.0提供了异步处理能力,允许Servlet在处理请求时启动一个独立的线程,从而避免阻塞容器线程。通过`AsyncContext`接口,可以实现非阻塞I/O和长时间运行的任务。 3. **监听器的注解注册**: 类似于Servlet...

    Servlet 3.0 - Apache Tomcat 7.0.61

    一、Servlet 3.0新特性 1. 注解支持:Servlet 3.0引入了注解(Annotation)来声明Servlet、Filter和Listener,避免了XML配置文件的繁琐。例如,`@WebServlet`、`@WebFilter`和`@WebListener`可以直接在类上声明,...

    servlet3.0

    Servlet 3.0是Java Servlet规范的一个重要版本,它在原有的Servlet 2.x基础上引入了多项新特性,极大地提升了Web应用程序的开发效率和灵活性。在这个版本中,servlet-api.jar作为核心库,包含了运行Servlet应用所...

    servlet-api-3.0.zip

    - **异步处理**:Servlet 3.0允许开发者实现异步Servlet,通过`AsyncContext`接口,可以将请求处理从主线程分离开来,提高并发性能。 - **WebSocket支持**:Servlet 3.0引入了对WebSocket协议的支持,通过`javax....

    servlet 3.0 异步 推送 聊天室

    Servlet 3.0引入了一种全新的特性,即异步处理能力,这极大地提高了Web应用程序的性能和响应性,尤其是在处理长时间运行的任务时。在传统的Servlet中,请求处理线程会一直占用,直到整个请求生命周期结束,这可能...

    Servlet 3.0新特性——文件上传接口

    5. **异步处理**:Servlet 3.0引入了异步处理能力,可以用于文件上传场景。当文件较大时,可以启动一个新的线程或使用ExecutorService来处理上传,从而避免阻塞主线程,提升响应速度。 6. **安全性增强**:Servlet ...

    Servlet 3.0 API - Apache Tomcat 7.0.41

    4. **异步处理**:Servlet 3.0引入了异步处理能力,允许Servlet在处理请求时释放线程,提高服务器性能。通过调用`HttpServletRequest.startAsync()`方法,开发者可以启动一个异步上下文,然后在后台执行长时间运行的...

    Servlet3.0_新特性

    本文将深入探讨Servlet3.0的新特性,重点解析异步处理支持、新增注解支持以及可插性支持,这些特性极大地提升了Web应用的性能和开发者的便利性。 ### 异步处理支持 异步处理是Servlet3.0最令人瞩目的新特性之一。...

    javax.servlet-3.0

    开发人员可以将此库添加到他们的项目中,以利用Servlet 3.0提供的新功能。它包含Servlet API的接口和类,如`HttpServlet`、`ServletConfig`、`HttpServletRequest`、`HttpServletResponse`等,以及用于注册Servlet和...

Global site tag (gtag.js) - Google Analytics