`

Servlet3.0新特性之异步请求实践

    博客分类:
  • J2EE
 
阅读更多

 

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 新特性

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

    Servlet3.0 新特性之模块化实践

    总结,Servlet 3.0的新特性显著提升了Web应用的开发效率和性能,通过模块化、注解、异步处理、可插拔容器、依赖注入和过滤器链改进等手段,提供了更加现代、灵活和高效的开发体验。对于开发者来说,理解和掌握这些...

    Servlet3.0参考手册

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

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

    在本篇文章中,我们将深入探讨Servlet3.0的主要新特性,包括注解、异步处理、容器初始化参数以及模块化部署等。 首先,Servlet3.0最显著的特征之一是广泛使用注解(Annotation)。传统的Servlet配置通常需要在web....

    servlet 3.0新增功能详解

    异步处理是 Servlet 3.0 中最为显著的新特性之一。这一特性解决了传统 Servlet 在处理长时间运行的任务时存在的问题。在之前的版本中,当 Servlet 接收到请求后,会执行一系列操作,包括预处理请求数据、调用业务...

    Servlet 3.0新特性——文件上传接口

    Servlet 3.0是Java EE 6规范的一部分,它引入了许多新特性,极大地提升了Web开发的效率和灵活性。其中,文件上传接口的改进是开发者们非常关注的一个亮点。在这个更新中,Servlet API提供了更简单、更高效的方式来...

    Servlet3.0特性详解

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

    Servlet3.0新特性解析01

    总结来说,Servlet3.0的新特性带来了更简洁的配置、更高效的异步处理、更灵活的过滤器和监听器注册,以及对文件上传的内置支持。这些改进都极大地推动了Java Web应用的开发效率和性能,使得开发人员能够更加专注于...

    servlet3.0.jar下载

    Servlet 3.0是Java Servlet规范的一个重要版本,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。这个"javax.servlet-api-3.0.1.jar"文件是Servlet 3.0规范的API实现,包含了开发人员编写...

    Servlet3.0_新特性

    异步处理是Servlet3.0最令人瞩目的新特性之一。在Servlet3.0之前,Servlet处理请求的过程通常是同步的,即Servlet线程在接收请求后会阻塞,直到所有业务处理完成并生成响应,然后才结束。这种模式在处理高延迟任务...

    Servlet 3.0jar包和source包

    首先,Servlet 3.0作为Servlet API的一个版本,引入了许多新特性以提高开发效率和灵活性: 1. **注解配置**:在Servlet 3.0之前,开发者需要在web.xml文件中手动配置Servlet和过滤器。而Servlet 3.0允许使用注解...

    Spring Boot实现异步请求(Servlet 3.0)

    Spring Boot 实现异步请求(Servlet 3.0) Spring Boot 实现异步请求是指在 Spring Boot 应用程序中使用异步处理机制来处理请求,以提高系统的性能和吞吐量。在 Spring 3.2 及以后版本中增加了对请求的异步处理,...

    servlet3.0推送聊天室

    Servlet 3.0作为Servlet规范的一个重要版本,引入了许多新特性,其中最引人注目的就是异步处理和支持Web插座(WebSocket),这使得实时通信如聊天室的实现变得更加便捷。本文将深入探讨如何利用Servlet 3.0的异步...

    servlet3.0-demo

    在这个名为“servlet3.0-demo”的项目中,我们重点探讨的是如何利用Servlet 3.0的新特性进行文件上传操作,并且采用注解的方式来简化代码。 在Servlet 3.0之前,我们需要在web.xml中配置Servlet,然后通过继承...

    servlet3.0.zip

    Servlet 3.0是Java Servlet规范的一个重要...总的来说,“servlet3.0.zip”包含的资源为开发者提供了使用Servlet 3.0规范进行Web开发的基础,通过学习和实践,开发者可以构建高效、灵活且易于维护的Java Web应用程序。

    Jsp/Servlet3.0 ppt和代码

    【标题】"Jsp/Servlet3.0 ppt和代码"涉及的是Java服务器页面(JSP)和Servlet 3.0版本的关键技术。JSP是一种动态网页技术,它允许开发者将HTML代码与Java代码混合编写,从而实现服务器端的动态内容生成。而Servlet是...

    servlet 3.0 jar 包综合下载

    在Servlet 3.0规范中,引入了许多新特性,旨在提高开发效率、简化编程模型以及增强可扩展性。下面将详细阐述Servlet 3.0的主要知识点。 1. **注解驱动的配置**:Servlet 3.0引入了注解(Annotation)来替代XML配置...

    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特性的示例。以下是...

    servlet3.0 规范pdf 包含javadoc

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

Global site tag (gtag.js) - Google Analytics