Servlet-异步执行AsyncContext
2015年9月18日
1 目标:执行耗时操作时,异步返回,避免阻塞。
2 原理:启动新的线程执行耗时操作,实时返回。
3 流程:创建Servlet,异步开启新线程。线程结束后,将请求转发到其它的目标或结束。
4 方法:
4.1 创建Servlet:启用异步,设置响应内容类型。
启用异步:@WebServlet(value="/b.do",asyncSupported=true)
设置响应内容类型:response.setContentType("text/html;charset=GBK");
注意:如果不设置响应内容类型,将无法启用异步。
开启新线程:使用AsyncContext开启新的线程实例。
AsyncContext ctx=request.startAsync();
ctx.setTimeout(30*1000);
ctx.start(new Task(ctx));
4.2 线程处理:设置异步上下文,处理请求
设置异步上下文:AsyncContext实例:
public Task(AsyncContext ctx) {
super();
this.ctx = ctx;
}
private AsyncContext ctx=null;
处理请求:处理完成后可以转发(dispatch)或结束(complete)。
ServletRequest req=ctx.getRequest();
req.setAttribute("async", "This is anasync msg:"+new Date());
ctx.dispatch("/a.jsp");
4.3 示例:异步处理耗时任务
//AsynServlet.java
package lee;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
importjavax.servlet.AsyncContext;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class AsynServlet
*/
@WebServlet(value="/b.do",asyncSupported=true)
public class AsynServletextends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AsynServlet() {
super();
// TODO Auto-generated constructor stub
}