`
coach
  • 浏览: 383430 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

Servlet3.0的异步处理

阅读更多
       Java servlet是大家公认的服务器端web技术的标准,包括jsp,jsf,和大量的web框架,soap,RESTful web service api ,还有新闻供应。servlet运行在这些技术下面,以保证这些技术可以运行在任何java web服务器上。所以servlet的任何变化都会对所有与服务器有关的技术产生影响。

        已经在2009年1月通过公众审核的servlet3.0,是一个包含很多重要特性的最新版本,它的出现将会给java web开发者带来更好的体验。下面就是servlet3.0所包含的新的特性。

1,支持异步处理。

2,配置简单。

3,可插入性。

4,增强既存api。

        支持异步处理是servlet3.0的最重要的特征,它将更便捷服务器端ajax application的开发,以下将重点讲述servlet在支持异步处理上所做的处理,主要是连接和线程消耗。以及当今应用异步处理的实现,例如:comet和reverse ajax。最后还将介绍有关servlet3.0的其他特性。

        异步支持:背景概念

        web2.0迅速地改变了服务器与客户端的通信方式,servlet3.0的支持异步处理正是基于这种变化的回应。为了彻底地理解异步处理,首先我们先回顾一下http通信的进化史。

        http1.0和http1.1

        http1.1标准的一个重要的改善部分是能够建立持续的链接,在http1.0时代,服务器与客户端的通信在一次请求和回应后就会被关闭,但是在http1.1标准下,在多次请求的过程中,链接能够持续保持和可用。持续的连接减少了网络连接缓慢的可见状态,因为客户端不必在每次请求后都重新建立tcp连接。

        基于连接的线程

        解决怎样使服务器能更具有扩展性是现在许多研究人员正在进行的课题,基于http1.1持续连接的http连接线程,是研究人员们所采用的一个通用的解决方案,在这个策略下,每一个客户端与服务器端的连接都与一个服务器端的线程有联系,线程由一个服务器控制的线程池来管理,一旦一个连接关闭,负责这个连接的线程将会被收回,并重新放回线程池以备其他连接使用。依靠硬件配置,这种方式可以处理大量的并行连接,有试验表明,服务器端的内存消耗会随着连接数量的增加成比例的增长,原因很简单,线程与内存使用是成比例的。所以配置了固定数量线程的服务器会产生线程死锁现象,因此一旦服务器线程池里的线程全部被占用,来自客户端的请求就会被拒绝。另外,有很多的站点,用户请求服务器页面的机会很少,服务器连接线程在很长时间都处于闲置状态,这也是一种资源的浪费。

        基于请求的线程

        由于在java4的nio中新的i/o api中出现的无阻塞(non-blocking i/o)i/o处理能力,把原来的一个连接需要附加一个线程的处理方式变成只有当该请求被处理的时候才被分派线程的处理方式。当连接在请求的过程中处于闲置状态时,它会被放置到一个中央选择处理集合里,来观测新的请求而不是消耗一个独立的线程。这种模式被称为基于请求的进程。潜在的允许服务器在固定线程的基础上处理不断增长的用户连接。在相同硬件条件下,这种方式比基于连接进程方式扩展的更好。 现在很多web服务器,如:tomcat,jetty,glassfish,weglogic,websphere都通过java NIO应用这种方式。对于应用程序开发人员,这些都是以隐藏的方式进行的,不会通过servlet api暴露出来。

        迎接ajax挑战

        为了提供更丰富的用户体验和交互,越来越多的web application应用了ajax,应用ajax应用的用户会获得更多的与服务器的交互,不同于以往请求的是,ajax用户请求可以更频繁的被发送到服务器端,另外,客户端和脚本也在促使着服务器技术的更新,越来越多的同步请求 导致大量的线程被消耗,这使得基于请求线程方式的优点几乎销蚀殆尽。

        运行缓慢,有限的资源

        有些运行缓慢的后台常规工作更加恶化这个形势,例如:有些请求可能因为已经废弃的jdbc连接池或者低通量服务器端的原因而被阻塞,等待请求的线程可能被阻止很长时间直到资源再次可用。最好的办法是把请求放到一个中央集权的队列中等待可用资源,并回收不可用的线程。这种方式有效地协调了大量请求和运行缓慢的后台程序。它同时也暗示了在某种程度上放在队列里的请求是没有任何线程与之对应的。servlet3.0的支持异步通信正是为了在一个广泛的可移植的方式上(不管是否应用ajax)实现这个目标。下面的代码将阐述它是怎样实现的:
@WebServlet(name="myServlet", urlPatterns={"/slowprocess"}, asyncSupported=true)
public class MyServlet extends HttpServlet {
   
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        AsyncContext aCtx = request.startAsync(request, response); 
        ServletContext appScope = request.getServletContext();
        ((Queue<AsyncContext>)appScope.getAttribute("slowWebServiceJobQueue")).add(aCtx);
    }
}

@WebServletContextListener
public class SlowWebService implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        Queue<AsyncContext> jobQueue = new ConcurrentLinkedQueue<AsyncContext>();
        sce.getServletContext().setAttribute("slowWebServiceJobQueue", jobQueue);
        // pool size matching Web services capacity
        Executor executor = Executors.newFixedThreadPool(10);
        while(true)
        {
            if(!jobQueue.isEmpty())
            {
                final AsyncContext aCtx = jobQueue.poll();
                executor.execute(new Runnable(){
                    public void run() {
                        ServletRequest request = aCtx.getRequest();
                        // get parameteres
                        // invoke a Web service endpoint
                        // set results
                        aCtx.forward("/result.jsp");
                    }                    
                });             
            }
        }
    }
    
    public void contextDestroyed(ServletContextEvent sce) {
    }
}

     在这段代码,当asyncSupported 属性被设置为true时,response对象还没有被赋给exit方法。调用startAsync方法返回一个AsyncContext对象,它用来缓存request和response对象,该AsyncContext对象被存放在一个application域队列里,紧接着,doGet方法执行并返回,原始的request线程被回收,在ServletContextListener对象,在application开始监视上述队列并随时回收request处理过程,在request对象被处理后,你有选择调用ServletResponse.getWriter.print()方法然后调用complete方法来提交Response,或者是调用forward方法来导向一个jsp来显示结果,注意这些jsp页面是带有被设置为false的asyncSupported属性的servlets。

     另外,在servlet3.0中的AsyncEvent和AsyncListener类可以给开发者对于异步生命周期事件精心的控制,你可以通过ServletRequest.addAsyncListener方法来注册一个AsyncListener类,在startAsync方法被调用后,当异步处理结束或者过期后,一个AsyncEvent被立即发送给上述已注册的AsyncListener类。AsyncEvent也像AsyncContext对象一样包含一个request和response对象。

     服务器端推技术

     servlet3.0异步特征的一个更重要,更有趣的应用案例就是服务器端推技术。Gtalk(一种可以使Gmail用户在线聊天的小工具)就是使用服务器端推技术的案例,Gtalk不经常访问服务器去核对是否有可以显示的新信息。相反,它等待服务器向回弹推新信息,这种方式有两种显著的优点:不用频繁发送request的低滞后通信,不浪费服务器资源和网络带宽。

     ajax技术允许用户可以在处理很多请求的同时通过页面与服务器进行交互,一个普遍的用途就是用ajax来访问服务器来获得更新的状态而不打断用户操作,但是高频率访问会浪费服务器资源和网络带宽,如果服务器可以动态向浏览器弹推数据,换句话说,通过事件向客户端传送异步信息(状态改变)。ajax application将会表现的更优雅并且节省珍贵的服务器资源和网络带宽。

     http协议是一个请求回复的协议,一个客户端发送请求信息到服务器端,服务器通过一个回复信息回复客户端。服务器不能初始化客户端或者发送一个非期望的信息给客户端。http协议的这个方面使得服务器弹推信息看起来不可能,但是很多有创意的技术可以绕开这个限制。

     service streaming技术,允许一个服务器通过事件触发而不是从客户端发送过来的请求来向客户端发送消息,实际的实现方法是:客户端通过一个请求来初始化一个连接,回复信息会在服务器端事件发生的时候被一点一点地返回,理论上,回复信息永久持续,这些信息片可以被客户端浏览器接收,解析并显示在浏览器上。

     long polling技术,也叫异步访问,是一种纯server push and client pull技术,这种技术基于Bayeux协议,像service streaming 一样,客户端通过请求与服务器建立一个连接,服务器保持该请求直到一个事件的发生,一旦事件发生,一个完整的回复信息被返回给客户端。一接收到回复信息,客户端立即发送一个新的信息,这样服务器端几乎一直持有一个通过服务器端事件触发回复消息的请求。long polling技术比service streaming 更容易在浏览器上实现。

     passive piggyback技术,当服务器有更新信息需要发送给客户端时,它等待来自客户端的下一个请求,一旦接收到下一个请求,它会把该更新信息连同客户端期望的回复信息一并发送给客户端。

     service streaming和long polling 技术通过ajax实现,以Comet 或者reverse ajax最为著名。

     ajax改善了单用户响应性,像comet一样的服务器端推技术使得应用程序响应更具有协作性,多用户形式,而且不占用正常访问的消耗。

      客户端方的技术,如:隐藏的iframe,xmlhttprequest,dojo,jquery类库不在本文讨论范围内,我们要探讨的是servlet3.0怎样帮助实现服务器端推技术。

      有效线程利用:一个更广泛的解决方案。

      comet一直占用一个等待在服务器端的管道返回状态更新信息,这个管道不可以再被客户端用来发送原始请求,所以comet实际上是在一个客户身上建立了两个连接,如果应用程序保持在基于请求的线程方式,每个连接都会被关联一个特殊线程,这就导致了线程数大于实际用户数。应用基于请求线程的comet应用只能在有限的线程消耗范围内扩展。

   未完待续。。。



分享到:
评论

相关推荐

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

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

    Java Servlet3.0异步处理问题

    主要介绍了Java中Servlet3.0异步处理的原理以及遇到的问题分析,需要的朋友参考一下。

    servlet 3.0 异步 推送 聊天室

    servlet 3.0 异步 推送 聊天室,application.js里的上下文路径修改成当前上下文,就可以运行了。

    servlet3.0推送聊天室

    用servlet3.0异步技术,实现推送信息至客户端的聊天室

    Servlet3.0

    Servlet3.0新特性解析_02_Servlet3.0的异步支持与反向Ajax深入详解Servlet3.0新特性解析_02_Servlet3.0的异步支持与反向Ajax深入详解

    详解Servlet 3.0/3.1 中的异步处理

    主要介绍了详解Servlet 3.0/3.1 中的异步处理,实例分析了servlet 3.0异步处理的技巧,非常具有实用价值,需要的朋友可以参考下

    servlet 3.0新增功能详解

    Servlet 是 Java EE 规范体系的重要组成部分,也是 Java 开发人员必须具备的基础...本文主要介绍了 Servlet 3.0 引入的若干重要新特性,包括异步处理、新增的注解支持、可插性支持等等,为读者顺利向新版本过渡扫清障碍

    Spring Boot实现异步请求(Servlet 3.0)

    在spring 3.2 及以后版本中增加了对请求的异步处理,这篇文章主要介绍了Spring Boot实现异步请求(Servlet 3.0),感兴趣的小伙伴们可以参考一下。

    JavaEE 6 Servlet 3.0 中的新特性

    • 异步Servlet • Servlet 3.0 — 易于开发 – 主要关注点 • 增强了API 以便使用SE 5 中新的语言特性 – 例如:批注、泛型(Generics) – 在上次JavaEE 5 中漏掉的Servlet • 部署描述批注 – 现在web.xml 为可选 ...

    Servlet3.0新特性,Servlet3新特性,Servlet3注解,Servlet3异步处理【蕃薯耀】

    NULL 博文链接:https://fanshuyao.iteye.com/blog/1688318

    浅谈servlet3异步原理与实践

    本篇文章主要介绍了servlet3异步原理与实践,详细的介绍了servlet和异步的流程使用,具有一定的参考价值,有兴趣的可以了解一下

    async-hessian:通过Servlet 3.0 AsyncContext导出Hessian服务的方法

    通过Servlet 3.0 AsyncContext导出服务的方法 如何获得? 您可以将其用作Maven依赖项: &lt; groupId&gt;org.jmmo &lt; artifactId&gt;async-hessian &lt; version&gt;1.1 或在以下位置下载最新版本: : 如何使用它? 创建...

    Apache服务器tomcat7.0.12最新版,加入probe线程监视

    TOMCAT 7新特性  1 使用随机数去防止跨站脚本攻击。  2 改变了安全认证中的jessionid... 根据Mark Thomas,Tomcat 7委员会的经理的说法,Tomcat 7最显著的三个特征是Servlet 3.0,内存检测泄露和增强的安全特性。

    基于CXF+servlet整合spring接口系统

    基于spring+serlvet+CXF+servlet异步实现等融合成的开发框架,可以实现多线程和异步并发操作,采用servlet3.0自带的异步实现方式,jdk1.6版本,javaee1.6

    annotaction

    1. 异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才 结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己 在不...

    apache-tomcat-7.0.28

     根据Mark Thomas,Tomcat 7委员会的经理的说法,Tomcat 7最显著的三个特征是Servlet 3.0,内存检测泄露和增强的安全特性。  Tomcat 7的例子程序中,包含了Eclipse的工程文件和Ant的构建文件,以方便去构建war文件...

    Java™ Servlet 规范.

    1.4 Servlet 与其他技术的比较 ........................................................................................................................14 1.5 与 Java 平台企业版的关系 ......................

    JSP+Servlet+EJB3.0+Oracle10g火车售票系统

    本系统主要实现火车查询售票功能,主要的功能如下: 客户端管理功能: (1)动车基本信息管理模块;...4.本设计采用JSP+Servlet+EJB3.0+Oracle10g工具进行开发,最后通过JDBC进行与数据库的相关的链接。

    看透springMvc源代码分析与实践

    22.1.1 Servlet 3.0处理异步请求实例282 22.1.2 异步请求监听器Async-Listener284 22.2 Spring MVC中的异步请求286 22.2.1 Spring MVC中异步请求相关组件286 22.2.2 Spring MVC对异步请求的支持297 22.2.3 ...

Global site tag (gtag.js) - Google Analytics