1、为什么要使用异步Servlet?
非常适用于以下情况的Web应用程序
—— 长处理时间或者伪长处理时间
—— 等待资源释放——如数据库连接
—— 等待事件发生——如聊天消息
—— 等待缓慢服务的响应——如Web服务
释放当前请求处理以便处理其他请求
—— 为Web容器提供了更好的可伸缩性
浏览器将仍然显示为等待中
—— 用户体验没有改变
不要与异步I/O混淆
——目前的Servlet3.0不支持
2、AsyncContext 基本知识
调用HttpServletRequest.startAsync()将servlet置于异步模式
—— 流将不在从Servlet.service()返回时提交
—— 返回AsyncContext对象
AsyncContext.start()启动请求
—— 将其指派给工作线程
AsyncContext.dispatch()
—— 通知工作已经完成
—— 将控件传递回Web容器
在以前的Servlet规范化,如果Servlet作为控制器调用了一个耗时的业务方法,那么必须等到业务方法完全返回之后才能生成响应,这将使用Servlet对业务方法的调用变成一种阻塞式的调用,因此效率比较低。
Servlet3.0规范引入了异步处理来解决这个问题,异步处理允许Servlet重新发起一条新线程去调用 耗时业务方法,这样就可以避免等待。
Servlet3.0的异步处理是通过AsyncContext类来处理的,Servlet可通过ServletRequest的如下两个方法开启异步调用,创建AsyncContext对象:
AsyncContext startAsync()
AsyncContext startAsync(ServletRequest,ServletResponse)
3、Servlet3.0异步请求实例
这个例子只有2文件,一个Servlet和一个Jsp,代码如下:
AsynServlet.java
package org.test; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.servlet.AsyncContext; import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @ClassName: AsynServlet * @description: 使用批注的方式,指定这个Servlet的映射URL,后面那个配置是设置其是支持异步请求 * * 1、其它创建一个异步请求和我们平常使用Servlet没什么区别,当然Filter也可以设置为异步的。 * 2、但是在使用异步请求,我们需要注意一些东西: * 1)异步请求完成后指定向的JSP页面,session必须设定为false * 2)AsyncListener监听中监听开始在实际无效 * 3)如果存在过滤器过滤该Servlet,则必须把Filter也要设置为asyncSupported=true,否则会出现异常,提示不支持异步 * * @createDate: 2013-5-30 下午4:59:31 * @author linyaoliang * @version */ @WebServlet(urlPatterns="/async",asyncSupported=true) public class AsynServlet extends HttpServlet { private static final long serialVersionUID = 5419388337018572479L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=GBK"); PrintWriter out = resp.getWriter(); out.println("<title>异步调用示例</title>"); out.println("进入Servlet的时间:"+new java.util.Date()+".<br>"); out.flush(); if(req.getAsyncContext() != null) { System.out.println("异步上下文已经存在"); } //创建AsyncContext,开始异步调用 AsyncContext actx = req.startAsync(); actx.addListener(new MyAsyncListener()); //设置异步调用的超时时长 actx.setTimeout(30*1000); //异步请求上下文启动异步处理线程 actx.start(new Executor(actx)); //启动后,输出结束时间 out.println("结束Servlet的时间:"+new java.util.Date()+".<br>"); out.flush(); } /** * * @ClassName: Executor * @description: 这个是异步请求需要启动来处理长时间业务的线程 * @createDate: 2013-5-30 下午4:56:55 * @author linyaoliang * @version AsynServlet */ class Executor implements Runnable{ private AsyncContext actx = null; public Executor(AsyncContext actx) { this.actx = actx; } @Override public void run() { try { System.out.println("===================="); Thread.sleep(5*1000); ServletRequest request = actx.getRequest(); List<String> books = new ArrayList<String>(); books.add("Java Programer"); books.add("Strut Spring hibernate"); books.add("Test Action"); request.setAttribute("books", books); System.out.println("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"); //当该线程完成后,则返回指定的到这个JSP页面,这个JSP页面必须指定session="false",在这个JSP页面里你可以看到 actx.dispatch("/async.jsp"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * * @ClassName: MyAsyncListener * @description: 异步请求提供的监听 * @createDate: 2013-5-30 下午4:54:58 * @author linyaoliang * @version AsynServlet */ class MyAsyncListener implements AsyncListener { @Override public void onComplete(AsyncEvent arg0) throws IOException { System.out.println("异步请求已经完成:"+arg0.getAsyncContext().getTimeout()); } @Override public void onError(AsyncEvent arg0) throws IOException { System.out.println("异步请求出错了:"+arg0.getAsyncContext().getTimeout()); } @Override public void onStartAsync(AsyncEvent arg0) throws IOException { //虽然提供了这个监听方法,但是实际没用,因为都是在已经启动异步请求后,得到AsynContext,再去绑定这个监听,可以在上面的代码中看到 System.out.println("异步请求已经开始:"+arg0.getAsyncContext().getTimeout()); } @Override public void onTimeout(AsyncEvent arg0) throws IOException { System.out.println("异步请求已经超时:"+arg0.getAsyncContext().getTimeout()); } } }
async.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>异步响应的消息</title> </head> <body> <ul> <c:forEach items="${books }" var="book"> <li>${book }</li> </c:forEach> </ul> <%out.println("业务调用结束时间:"+new java.util.Date()); %> </body> </html>
相关推荐
Servlet3.0是Java Servlet API的一个重要版本更新,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。以下将详细讲解Servlet3.0的关键特性。 1. **注解驱动的配置**: 在Servlet3.0之前,...
总结,Servlet 3.0的新特性显著提升了Web应用的开发效率和性能,通过模块化、注解、异步处理、可插拔容器、依赖注入和过滤器链改进等手段,提供了更加现代、灵活和高效的开发体验。对于开发者来说,理解和掌握这些...
Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。这份"Servlet3.0参考手册"无疑为开发者提供了全面的API参考和实用指南。 首先,Servlet3.0...
在本篇文章中,我们将深入探讨Servlet3.0的主要新特性,包括注解、异步处理、容器初始化参数以及模块化部署等。 首先,Servlet3.0最显著的特征之一是广泛使用注解(Annotation)。传统的Servlet配置通常需要在web....
异步处理是 Servlet 3.0 中最为显著的新特性之一。这一特性解决了传统 Servlet 在处理长时间运行的任务时存在的问题。在之前的版本中,当 Servlet 接收到请求后,会执行一系列操作,包括预处理请求数据、调用业务...
Servlet 3.0是Java EE 6规范的一部分,它引入了许多新特性,极大地提升了Web开发的效率和灵活性。其中,文件上传接口的改进是开发者们非常关注的一个亮点。在这个更新中,Servlet API提供了更简单、更高效的方式来...
Servlet3.0是Java EE平台中的一个重要组成部分,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。以下是对Servlet3.0主要特性的详细解释: 1. **注解配置**: 在Servlet3.0中,我们可以...
总结来说,Servlet3.0的新特性带来了更简洁的配置、更高效的异步处理、更灵活的过滤器和监听器注册,以及对文件上传的内置支持。这些改进都极大地推动了Java Web应用的开发效率和性能,使得开发人员能够更加专注于...
Servlet 3.0是Java Servlet规范的一个重要版本,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。这个"javax.servlet-api-3.0.1.jar"文件是Servlet 3.0规范的API实现,包含了开发人员编写...
异步处理是Servlet3.0最令人瞩目的新特性之一。在Servlet3.0之前,Servlet处理请求的过程通常是同步的,即Servlet线程在接收请求后会阻塞,直到所有业务处理完成并生成响应,然后才结束。这种模式在处理高延迟任务...
首先,Servlet 3.0作为Servlet API的一个版本,引入了许多新特性以提高开发效率和灵活性: 1. **注解配置**:在Servlet 3.0之前,开发者需要在web.xml文件中手动配置Servlet和过滤器。而Servlet 3.0允许使用注解...
Spring Boot 实现异步请求(Servlet 3.0) Spring Boot 实现异步请求是指在 Spring Boot 应用程序中使用异步处理机制来处理请求,以提高系统的性能和吞吐量。在 Spring 3.2 及以后版本中增加了对请求的异步处理,...
Servlet 3.0作为Servlet规范的一个重要版本,引入了许多新特性,其中最引人注目的就是异步处理和支持Web插座(WebSocket),这使得实时通信如聊天室的实现变得更加便捷。本文将深入探讨如何利用Servlet 3.0的异步...
在这个名为“servlet3.0-demo”的项目中,我们重点探讨的是如何利用Servlet 3.0的新特性进行文件上传操作,并且采用注解的方式来简化代码。 在Servlet 3.0之前,我们需要在web.xml中配置Servlet,然后通过继承...
Servlet 3.0是Java Servlet规范的一个重要...总的来说,“servlet3.0.zip”包含的资源为开发者提供了使用Servlet 3.0规范进行Web开发的基础,通过学习和实践,开发者可以构建高效、灵活且易于维护的Java Web应用程序。
【标题】"Jsp/Servlet3.0 ppt和代码"涉及的是Java服务器页面(JSP)和Servlet 3.0版本的关键技术。JSP是一种动态网页技术,它允许开发者将HTML代码与Java代码混合编写,从而实现服务器端的动态内容生成。而Servlet是...
在Servlet 3.0规范中,引入了许多新特性,旨在提高开发效率、简化编程模型以及增强可扩展性。下面将详细阐述Servlet 3.0的主要知识点。 1. **注解驱动的配置**:Servlet 3.0引入了注解(Annotation)来替代XML配置...
Servlet 3.0是Java Web开发中的一个重要里程碑,它带来了许多新特性和改进,使得开发者在构建Web应用程序时更加高效和灵活。Apache Tomcat 7.0.61是广泛使用的开源Servlet容器,它实现了Servlet 3.0规范,提供了稳定...
Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。在这个"Servlet3.0 Demo"项目中,我们可以看到一个典型的使用Servlet3.0特性的示例。以下是...
Servlet 3.0是Java服务器页面(JSP)和Servlet技术的一个重要版本更新,它引入了许多新特性,提升了Web应用程序的开发效率和灵活性。在JSR-315(JavaTM Servlet 3.0 API Specification)中,专家小组对这项规范进行...