`
cucaracha
  • 浏览: 141858 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A8f3fa2f-18ce-3862-897a-5d2209197c90
Java NIO.2
浏览量:88158
7a076ba7-8ec8-3241-aa3c-67bb2f7856a2
Java EE 7 简明教...
浏览量:36831
社区版块
存档分类
最新评论

[Java EE 7] Servlet 异步支持

阅读更多
服务器资源非常宝贵,因此需要节省开销。比如 servlet 需要等待数据库查询数据、等待生成报表、等待读取文件系统数据,等等。这些“长时间处理”将会完全地占用容器线程,于是,这些被占用的线程将无法再接收其它的请求,这对于珍贵的服务器资源来说,并没有做到最佳优化。

这些需要“长时间处理”的地方我们可以使用异步处理来进行优化,servlet 接收到请求后,开启新的线程来进行长时间处理,并将容器线程返还给容器,这样容器线程就可以继续接收其它请求,等长时间运行的线程执行完成后,再使用和请求相同的容器线程响应到客户端。

异步行为需要显示地在 servlet 中声明,可以在 @WebServlet 中添加 asyncSupported 属性:

@WebServlet(urlPatterns="/async", asyncSupported=true)
public class MyAsyncServlet extends HttpServlet {
  //. . .
}


也可以在 web.xml 中设置 <async-supported> 元素的值为 true,也可以使用代码的方式 ServletRegistration.setAsyncSupported(true)。

开始异步处理之前,需要调用 request 的 startAsync 方法来将容器线程分离。这个方法将会返回 AsyncContext 对象,这个对象是异步处理上下文,你可以显示地调用 AsyncContext.complete 来结束异步处理。

下面看看异步处理的例子:

class MyAsyncService implements Runnable {
  AsyncContext ac;

  public MyAsyncService(AsyncContext ac) {
    this.ac = ac;
  }

  @Override
  public void run() {
    //. . .
    ac.complete();
  }
}


这个服务可以在 doGet 中进行异步处理:

@Override
protected void doGet(HttpServletRequest request, 
                     HttpServletResponse response) {
  AsyncContext ac = request.startAsync();
  ac.addListener(new AsyncListener() {
    public void onComplete(AsyncEvent event) 
        throws IOException {
      //. . .
    }

    public void onTimeout(AsyncEvent event) 
        throws IOException {
      //. . .
    }
    //. . .
  });

  ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
  executor.execute(new MyAsyncService(ac));
}

在上面的代码中,request 开启了异步模式。AsyncListener 用于监听请求是否完成、超时或出错。MyAsyncService 作为长时间运行操作开启了一个新的线程,并且调用了 AsyncContext.complete 方法发出请求已完成的信号。

请求可以从异步的 servlet 发送到同步的 servlet,但是反过来却是非法的。

异步处理在 servlet filter 中也适用。

文章来源:http://www.aptusource.org/2014/04/java-ee-7-asynchronous-support/
0
0
分享到:
评论
1 楼 jiiming 2014-04-01  
这种方法可以借鉴

相关推荐

    Java EE 7 tutorial 中的examples代码

    1. **Servlet 3.1**:Java EE 7中Servlet规范升级到3.1版,引入了异步处理能力,允许Servlet在不阻塞请求的情况下执行长时间运行的任务。同时,Servlet 3.1还支持WebSocket协议,为实时通信提供了可能。 2. **JSP ...

    Java EE7权威指南

    卷一可能侧重于Java EE7的基础概念和技术,如Servlet 3.1、JSP 2.3、JavaServer Faces (JSF) 2.2、EJB 3.2以及WebSocket等。Servlet 3.1引入了异步处理和更好的生命周期管理,让Web服务更加高效。JSP 2.3和JSF 2.2则...

    Java.EE.7.Essentials

    同时,Java EE 7还提高了对异步处理和多线程编程的支持。 在《Java EE 7 Essentials》中,作者Arun Gupta深入讲解了各个组件技术的应用和开发细节。例如: 1. Servlets:作为Java EE中的标准Web组件技术,Servlet ...

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

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

    Java EE 7 API Documentation 官方英文版(html)

    Java EE 7支持JMS 2.0,增强了消息驱动Bean(MDB),使得消息处理更加灵活且易于使用。 5. **JPA (Java Persistence API)**:JPA是对象关系映射(ORM)的标准,使得Java对象可以透明地与数据库交互。Java EE 7中的...

    java ee 7 api

    Java EE 7(Java Platform, Enterprise Edition 7)是Java平台的一个版本,专注于为企业级应用程序开发提供一组标准的API和服务。这个平台包含了多种组件模型、服务接口和协议,旨在简化开发、部署和管理大型分布式...

    Java EE 7 Recipes

    ### Java EE 7 Recipes #### 重要知识点概览 **Java EE 7 Recipes** 这本书为读者提供了全面深入地了解Java Enterprise Edition (Java EE) 7 的机会,该版本在2013年发布,引入了许多新特性,旨在简化企业级应用的...

    JAVA_EE_api_中英文对照版.zip_Java ee api_JavaEE_java api_servlet api_y

    JMS是Java EE中用于异步通信的API,它定义了如何在分布式环境中创建、发送、接收和读取消息的标准。JMS常用于实现消息队列和发布/订阅模式。 9. **JTA(Java Transaction API)** JTA提供了分布式事务管理的接口...

    java ee 7 API

    Java EE 7的发布带来了许多新特性,改进了旧有的功能,并对Web服务和移动应用支持进行了增强。 Java EE 7 API包含以下几个核心领域: 1. **Servlet 3.1**:这是用于处理HTTP请求的核心组件。Servlet 3.1引入了异步...

    java ee基础使用教程

    Java EE支持创建和消费Web服务,包括基于SOAP(Simple Object Access Protocol)的WS-*规范和RESTful风格的服务。你将学习如何使用JAX-WS和JAX-RS来实现这两种类型的Web服务。 七、Web容器与应用服务器 Java EE应用...

    Java-EE-7.zip_JAVA EE_Java EE 7_平台

    Java EE 7作为该平台的一个重要版本,发布于2013年,引入了一系列新特性以提升开发效率和应用性能。 在Java EE 7中,主要包含以下几个关键组件和技术: 1. **Servlet 3.1**:这是用于处理HTTP请求的核心技术,新...

    Java EE 7 Development with WildFly

    - **Java Servlet API 3.1 (JSR 340)**:用于开发和部署Web应用的规范,支持异步操作。 - **JAX-RS (Java API for RESTful Web Services) 2.0 (JSR 339)**:提供了构建RESTful服务的标准方法。 - **Java Message ...

    Java EE 7 Essentials英文版

    Java EE 7 Essentials是一本专门为有Java EE基础的读者设计的教材,旨在帮助他们进一步提高相关技术能力。这本书由Arun Gupta编写,他有着丰富的Java EE方面的经验。Java EE 7 Essentials适合那些想要深入了解Java...

    java ee api

    Java EE(Java Platform, Enterprise Edition)是Oracle公司提供的一个企业级应用开发平台,它构建在Java SE(标准版)的基础上,为开发和部署分布式、多层的企业级应用程序提供了丰富的API和工具支持。Java EE旨在...

    JAVA EE中文文档

    JMS是JAVA EE提供的一种中间件服务,用于在分布式系统中进行异步通信。通过消息队列,JMS允许应用程序发送和接收消息,增强了系统的可扩展性和容错性。 **4. JPA(Java Persistence API)** JPA是JAVA EE中用于对象...

    Java.EE.7.pdf.zip

    1. **集成开发环境**:NetBeans提供了全面的代码编辑、调试、测试和部署工具,特别优化了对Java EE 7的支持。 2. **模板和向导**:为常见的Java EE组件,如Web服务、EJB、JPA实体等提供预定义的模板,快速创建项目...

    精通Java EE:精通Java EE 整合应用案例\源代码第五章

    7. **JMS(Java Message Service)**:JMS是Java消息传递的标准,用于异步通信。开发者可能需要了解如何创建消息队列,发送和接收消息,以及使用Message Driven Beans处理消息。 8. **Web Services**:Java EE支持...

    Java EE 7.zip

    1. **Servlet 3.1**:Java EE 7升级了Servlet规范至3.1版,引入了异步客户端API,使得服务器可以处理更多的并发请求。此外,还支持WebSocket协议,允许双向通信,为实时应用提供了基础。 2. **JSP 2.3**:Java...

Global site tag (gtag.js) - Google Analytics