浅谈servlet3异步原理与实践

  

  

servlet是基于Java的Web组件,由容器进行管理,来生成动态内容。像其他基于Java的组件技术一样,servlet也是基于平台无关的Java类格式,被编译为平台无关的字节码,可以被基于Java技术的Web服务器动态加载并运行。容器(容器),有时候也叫做servlet引擎,是Web服务器为支持servlet功能扩展的部分。客户端通过servlet容器实现的请求/响应模式(请求/应答模式)与servlet进行交互。

  

  

每当一个Servlet版本发布都会对应一个Servlet版本的规范,比如Servlet2.5, Servlet3.0 Servlet3.1。
  规范中描述了Java Servlet API的标准,定义了Java Servlet API中类,接口,方法签名的完整规范且附带的Javadoc文档供开发人员查阅,目的主要是为Java Servlet给出一个完整和清晰的解释。从下图可以看出Servlet规范版本和tomcat支持的版本的对应关系。比如Servlet3是从tomcat7以后开始支持的。

  

浅谈servlet3异步原理与实践“> </p>
  <p> Servlet和tomcat版本。png <br/>
  </p>
  <p> </p>
  <p>同步异步是数据通信的方式,阻塞和非阻塞是一种状态。比如同步这种数据通讯方式里面可以有阻塞状态也可以有非阻塞状态。</p>
  <p> </p>
  <p>这里说的位置是指,从tomcat处理整个请求请求流程中,异步处于哪一步。我们先梳理出在NIO模式下(是否使用NIO跟异步没有直接关系,这里是拿NIO模式下的tomcat流程做说明)、下面这个图是tomcat的总体结构,里面用箭头标明了请求线路。</p>
  <p> <img src=   2,通过请求获取异步上下文AsyncContext.AsyncContext asyncCtx=request.startAsync ();
  3、开启业务逻辑处理线程,并将AsyncContext传递给业务线程.executor。执行(新AsyncRequestProcessor (asyncCtx秒));
  4、在异步业务逻辑处理线程中,通过asyncContext获取请求和响应,处理对应的业务。
  5、业务逻辑处理线程处理完成逻辑之后,调用AsyncContext的完整的方法.asyncContext.complete();从而结束该次异步线程处理。

  

  

7.1, AsyncLongRunningServlet。java处理Servlet请求,并开启异步

        包com.test.servlet3;      进口javax.servlet.AsyncContext;   进口javax.servlet.ServletException;   进口javax.servlet.annotation.WebServlet;   进口javax.servlet.http.HttpServlet;   进口javax.servlet.http.HttpServletRequest;   进口javax.servlet.http.HttpServletResponse;   进口java.io.IOException;   进口java.util.concurrent.ThreadPoolExecutor;/* *   *由wangxindong: ID="   + Thread.currentThread () .getId ());      request.setAttribute (“org.apache.catalina。ASYNC_SUPPORTED”,真正的);      字符串时间=request.getParameter(“时间”);   int秒=Integer.valueOf(时间);//max 10秒   如果(秒比;10000)   秒=10000;      AsyncContext asyncCtx=request.startAsync ();   asyncCtx。新AppAsyncListener addListener (());   asyncCtx.setTimeout(9000);//异步servlet的超时时间,异步servlet有对应的超时时间,如果在指定的时间内没有执行完操作,响应依然会走原来servlet的结束逻辑,后续的异步操作执行完再写回的时候,可能会遇到异常。      ThreadPoolExecutor执行人=(ThreadPoolExecutor)请求   .getServletContext () .getAttribute(“执行人”);      遗嘱执行人。执行(新AsyncRequestProcessor (asyncCtx秒));   长endTime=System.currentTimeMillis ();   系统。println (“AsyncLongRunningServlet结束:Name="   + Thread.currentThread () . getname () + ":: ID="   + Thread.currentThread () .getId() + "::时间="   + (endTime -开始时间)+“女士”);   }   }      

浅谈servlet3异步原理与实践