服务器资源非常宝贵,因此需要节省开销。比如 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/
分享到:
相关推荐
1. **Servlet 3.1**:Java EE 7中Servlet规范升级到3.1版,引入了异步处理能力,允许Servlet在不阻塞请求的情况下执行长时间运行的任务。同时,Servlet 3.1还支持WebSocket协议,为实时通信提供了可能。 2. **JSP ...
卷一可能侧重于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还提高了对异步处理和多线程编程的支持。 在《Java EE 7 Essentials》中,作者Arun Gupta深入讲解了各个组件技术的应用和开发细节。例如: 1. Servlets:作为Java EE中的标准Web组件技术,Servlet ...
Servlet3.0是Java EE平台中的一个重要更新,它引入了许多新特性,其中一项重大改进就是对异步处理的支持。这项特性使得服务器可以处理长时间运行的任务,而不会阻塞其他请求,提高了系统的响应能力和效率。本实例...
Java EE 7支持JMS 2.0,增强了消息驱动Bean(MDB),使得消息处理更加灵活且易于使用。 5. **JPA (Java Persistence API)**:JPA是对象关系映射(ORM)的标准,使得Java对象可以透明地与数据库交互。Java EE 7中的...
Java EE 7(Java Platform, Enterprise Edition 7)是Java平台的一个版本,专注于为企业级应用程序开发提供一组标准的API和服务。这个平台包含了多种组件模型、服务接口和协议,旨在简化开发、部署和管理大型分布式...
### Java EE 7 Recipes #### 重要知识点概览 **Java EE 7 Recipes** 这本书为读者提供了全面深入地了解Java Enterprise Edition (Java EE) 7 的机会,该版本在2013年发布,引入了许多新特性,旨在简化企业级应用的...
JMS是Java EE中用于异步通信的API,它定义了如何在分布式环境中创建、发送、接收和读取消息的标准。JMS常用于实现消息队列和发布/订阅模式。 9. **JTA(Java Transaction API)** JTA提供了分布式事务管理的接口...
Java EE 7的发布带来了许多新特性,改进了旧有的功能,并对Web服务和移动应用支持进行了增强。 Java EE 7 API包含以下几个核心领域: 1. **Servlet 3.1**:这是用于处理HTTP请求的核心组件。Servlet 3.1引入了异步...
Java EE支持创建和消费Web服务,包括基于SOAP(Simple Object Access Protocol)的WS-*规范和RESTful风格的服务。你将学习如何使用JAX-WS和JAX-RS来实现这两种类型的Web服务。 七、Web容器与应用服务器 Java EE应用...
Java EE 7作为该平台的一个重要版本,发布于2013年,引入了一系列新特性以提升开发效率和应用性能。 在Java EE 7中,主要包含以下几个关键组件和技术: 1. **Servlet 3.1**:这是用于处理HTTP请求的核心技术,新...
- **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基础的读者设计的教材,旨在帮助他们进一步提高相关技术能力。这本书由Arun Gupta编写,他有着丰富的Java EE方面的经验。Java EE 7 Essentials适合那些想要深入了解Java...
Java EE(Java Platform, Enterprise Edition)是Oracle公司提供的一个企业级应用开发平台,它构建在Java SE(标准版)的基础上,为开发和部署分布式、多层的企业级应用程序提供了丰富的API和工具支持。Java EE旨在...
JMS是JAVA EE提供的一种中间件服务,用于在分布式系统中进行异步通信。通过消息队列,JMS允许应用程序发送和接收消息,增强了系统的可扩展性和容错性。 **4. JPA(Java Persistence API)** JPA是JAVA EE中用于对象...
1. **集成开发环境**:NetBeans提供了全面的代码编辑、调试、测试和部署工具,特别优化了对Java EE 7的支持。 2. **模板和向导**:为常见的Java EE组件,如Web服务、EJB、JPA实体等提供预定义的模板,快速创建项目...
7. **JMS(Java Message Service)**:JMS是Java消息传递的标准,用于异步通信。开发者可能需要了解如何创建消息队列,发送和接收消息,以及使用Message Driven Beans处理消息。 8. **Web Services**:Java EE支持...
1. **Servlet 3.1**:Java EE 7升级了Servlet规范至3.1版,引入了异步客户端API,使得服务器可以处理更多的并发请求。此外,还支持WebSocket协议,允许双向通信,为实时应用提供了基础。 2. **JSP 2.3**:Java...