Servlet 3引入一项新的特性,可以让Servlet异步处理请求,本文来介绍这新技术
一.概述
WebServlet 和 WebFilter 注解类型可以包含 asyncSupport属性。为了编写能够支持异步的Servlet和Filter ,该
属性必须为true
支持异步处理的Servlet或者Filter 可以通过在ServletRequest 中调用startAsync 方法来启动新的线程。
startAsync 有两个重载方法:
AsyncContext startAsync ()
AsyncContext startAsync(ServletRequest request ,ServletResponse response)
注意:重复调用startAsync方法将会启动同一个线程,将会抛出一个java.lang.lllegalStateException 异常
调用 AsyncContext的start方法不会造成阻塞,因此它派发的线程还没启动,也会继续执行下一行代码
二.编写异步的Servlet
如果你有一个任务需要相对比较长的时间才能完成,最好成绩一个Servlet或者Filter 。在异步的Servlet或者Filter类中
需要完成以下工作:
1.在ServletRequest 中调用startAsync 方法来启动新的线程
2.在AsyncContext中调用setTimeout()方法,设置一个任务必须在指定的时间内完成的毫秒数
3.调用asyncContext.start方法,传递一个执行长时间任务的Runnable
4.任务完成时,通过Runnable调用asyncContext.complete方法或者asyncContext.dispatch方法
举个例子
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name="AsyncDispatchServlet",
urlPatterns="/asyncDispatch",
asyncSupported=true)
public class AsyncDispatchServlet extends HttpServlet {
private static final long serialVer