`

Servlet3.0: 简介AsyncContext

    博客分类:
  • Java
阅读更多

转自: http://caterpillar.onlyfun.net/Gossip/ServletJSP/AsyncContext.html 

原文为繁体版, 通过Google 翻译整理

 

 

每个请求来到Web容器,Web容器会为其分配一条执行绪来专门负责该请求,直到回应完成前,该执行绪都不会被释放回容器。 执行绪会耗用系统资源,若有些请求需要长时间处理(例如长时间运算、等待某个资源),就会长时间占用执行绪,若这类的请求很多,许多执行绪都被长时间占用,对于系统就会是个效能负担,甚至造成应用程式的效能瓶颈。 


基本上一些需长时间处理的请求,通常客户端也较不在乎请求后要有立即的回应,若可以,让这类请求先释放容器分配给该请求的执行绪,让容器可以有机会将执行绪资源分配给其它的请求,可以减轻系统负担。 原先释放了容器所分配执行绪的请求,其回应将被延后,直到处理完成(例如长时间运算完成、所需资源已获得)再行对客户端的回应。 

在Servlet 3.0中,在ServletRequest上提供了 startAsync( )方法: 

 

 

 

AsyncContext startAsync() throws java.lang.IllegalStateException; 

AsyncContext startAsync(ServletRequest servletRequest, 
ServletResponse servletResponse) 
throws java.lang.IllegalStateException

 这两个方法都会传回AsyncContext介面的实作物件,前者会直接利用原有的请求与回应物件来建立AsyncContext ,后者可以让你传入自己建立的请求、回应包裹物件。 在呼叫了startAsync()方法取得AsyncContext物件之后,这次的回应会被延后,并释放容器所分配的执行绪。 

 


你可以透过AsyncContext的getRequest() 、 getResponse()方法取得请求、回应物件,此次对客户端的回应将暂缓至呼叫AsyncContext的complete()方法或dispatch()为止,前者表示回应完成,后者表示将回应调派给指定的URL  

若要能呼叫ServletRequest的startAsync()使用AsyncContext,你的 Servlet 必须能支援非同步处理,如果使用@WebServlet来标注,则可以设定其asyncSupportedtrue 。 例如:

 

@WebServlet(urlPatterns = "/some.do", asyncSupported = true ) 
public class AsyncServlet extends HttpServlet { 
... 

 

 如果使用web.xml设定Servlet,则可以设定<async-supported>标签为true :

 

... 
<servlet> 
<servlet-name>AsyncServlet</servlet-name> 
<servlet-class>cc.openhome.AsyncServlet</servlet-class> 
<async-supported>true</async-supported> 
</servlet> 
... 

 

 如果Servlet将会非同步处理,若其前端有过滤器,则过滤器亦需标示其支援非同步处理,如果使用@WebFilter ,同样是可以设定其asyncSupportedtrue 。 例如: 

 

@WebFilter(urlPatterns = "/some.do", asyncSupported = true ) 
public class AsyncFilter implements Filter{ 
... 

 

 如果使用web.xml设定过滤器,则可以设定<async-supported>标签为true : 

 

... 
<filter> 
< filter -name>AsyncFilter</ filter -name> 
< filter -class>cc.openhome.AsyncFilter</ filter -class> 
<async-supported>true</async-supported> 
</ filter > 
... 

 

 底下示范一个非同步处理的例子,对于进来的请求,Servlet会取得其AsyncContext ,并释放容器所分配的执行绪,回应被延后,对于这些被延后回应的请求,建立一个Runnable的物件,并将其排入一个执行绪池(Thread pool),执行绪池的执行绪数量是固定的,让这些必须长时间处理的请求,在这些有限数量的执行绪中完成,而不用每次请求都占用容器所分配的执行绪。 

 

 

package cc.openhome; 

  import java.io.*; 
  import java.util.concurrent.*; 
  import javax.servlet.*; 
  import javax.servlet.annotation.*; 
  import javax.servlet.http.*; 

  @WebServlet(name="AsyncServlet", urlPatterns={"/async.do"}, 
  asyncSupported = true ) 
  public class AsyncServlet extends HttpServlet { 
  // 执行绪池 
  private ExecutorService executorService = Executors.newFixedThreadPool(10); 

  protected void processRequest(HttpServletRequest request, 
  HttpServletResponse response) 
  throws ServletException, IOException { 
  response.setContentType("text/html; charset=UTF8"); 
  AsyncContext ctx = request.startAsync(); 
  executorService.submit(new AsyncRequest(ctx)); 
  } 

  @Override 
  protected void doGet(HttpServletRequest request, 
  HttpServletResponse response) 
  throws ServletException, IOException { 
  processRequest(request, response); 
  } 

  @Override 
  protected void doPost(HttpServletRequest request, 
  HttpServletResponse response) 
  throws ServletException, IOException { 
  processRequest(request, response); 
  } 

  @Override 
  public void destroy() { 
  executorService.shutdown(); 
  } 
  } 

 

 AsyncRequest是个实作Runnable的类别,其模拟了长时间处理: 

 

package cc.openhome; 

  import java.io.PrintWriter; 
  import javax.servlet.AsyncContext; 

  public class AsyncRequest implements Runnable { 
  private AsyncContext ctx; 

  public AsyncRequest( AsyncContext ctx ) { 
  this.ctx = ctx; 
  } 

  @Override 
  public void run() { 
  try { 
  // 模拟长时间的处理 
  Thread.sleep(10000); 
  PrintWriter out = ctx.getResponse() .getWriter(); 
  out.println("久等了...XD"); 
  // 这边才真正送出回应 
  ctx.complete(); 
  } catch (Exception e) { 
  e.printStackTrace(); 
  } 
  } 
  } 

 

 

 

分享到:
评论
1 楼 Uyghur_China 2016-06-01  
你上面的类写不了啊  ?

相关推荐

    Servlet3.0参考手册

    Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。这份"Servlet3.0参考手册"无疑为开发者提供了全面的API参考和实用指南。 首先,Servlet3.0...

    servlet 3.0 jar 包综合下载

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

    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包

    Servlet 3.0是Java服务器端编程的重要组成部分,主要用于构建动态Web应用程序。它是由Java Community Process(JCP)制定的标准,定义了一套用于处理HTTP请求的API,使得开发者可以编写服务器端程序来处理来自Web...

    maven servlet 3.0 eclipse config video

    2. **异步处理**: Servlet 3.0允许开发者编写异步Servlet,通过`AsyncContext`对象实现非阻塞I/O,提高应用性能。 3. **监听器和过滤器**: 可以使用注解`@WebListener`和`@WebFilter`声明监听器和过滤器,简化了配置...

    Servlet3.0特性详解

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

    servlet3.0 规范pdf 包含javadoc

    Servlet 3.0是Java服务器页面(JSP)和Servlet技术的一个重要版本更新,它引入了许多新特性,提升了Web应用程序的开发效率和灵活性。在JSR-315(JavaTM Servlet 3.0 API Specification)中,专家小组对这项规范进行...

    Servlet 3.0 - Apache Tomcat 7.0.61

    Servlet 3.0是Java Web开发中的一个重要里程碑,它带来了许多新特性和改进,使得开发者在构建Web应用程序时更加高效和灵活。Apache Tomcat 7.0.61是广泛使用的开源Servlet容器,它实现了Servlet 3.0规范,提供了稳定...

    Servlet3.0 Demo

    Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。在这个"Servlet3.0 Demo"项目中,我们可以看到一个典型的使用Servlet3.0特性的示例。以下是...

    servlet-api-3.0.zip

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

    Servlet3.0 新特性

    Servlet3.0是Java Servlet API的一个重要版本更新,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。以下将详细讲解Servlet3.0的关键特性。 1. **注解驱动的配置**: 在Servlet3.0之前,...

    servlet3.0的学习(二)

    Servlet 3.0是Java EE 6规范的一部分,它带来了许多增强的功能,使得Web应用程序的开发更为便捷。在这个部分的学习中,我们将深入探讨Servlet 3.0的关键特性,包括注解驱动的配置、异步处理、过滤器改进以及依赖注入...

    Servlet3.0

    Servlet3.0是Java EE平台中的一个重要里程碑,它在Servlet规范上引入了许多创新特性,极大地提高了Web应用的开发效率和性能。在这个版本中,重点强调了异步处理和反向Ajax的支持,这两个特性使得Web应用能够更加高效...

    Servlet 3.0规范

    这一特性通过`javax.servlet.AsyncContext`接口实现,使得Servlet可以异步处理请求,无需等待I/O操作完成即可释放线程。 #### 2. **异步处理** 异步处理是Servlet 3.0的重要特性之一,它允许Servlet在处理一个请求...

    servlet3.0文档html

    2. **异步处理**:Servlet 3.0引入了异步处理功能,通过Servlet API的AsyncContext接口,开发者可以将请求挂起并在后台线程中执行耗时操作,从而提高服务器的并发性能。例如,可以使用`startAsync()`方法启动异步...

    javax.servlet-3.0

    【标题】"javax.servlet-3.0" 是Java服务器页面(JSP)和Servlet技术的一个重要版本,这个版本主要关注于提升Web应用的性能、可扩展性和灵活性。它是由Java Community Process (JCP) 通过JSR(Java Specification ...

    Servlet3.0新特性解析01

    Servlet3.0是Java Servlet API的一个重大更新,它引入了许多新特性和改进,极大地提高了开发效率和灵活性。在这个解析中,我们将深入探讨Servlet3.0的核心特性,特别是Servlet注解的使用。 首先,Servlet3.0引入了...

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

    而在Servlet3.0中,可以通过`AsyncContext` API来实现异步处理,将请求处理逻辑从主线程分离出来,释放主线程处理其他请求。这样可以提高服务器的吞吐量和响应时间,尤其是处理长时间运行的任务时。 ```java @...

    servlet 3.0 异步 推送 聊天室

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

    Servlet3.0微框架

    Servlet3.0引入了异步处理能力,通过`AsyncContext`接口,开发者可以在不阻塞线程的情况下处理请求,提高了服务器的并发性能。这在处理耗时操作如大数据读写、远程调用等场景下非常有用。 3. **过滤器与监听器的...

Global site tag (gtag.js) - Google Analytics