public void run() {
//在这里做耗时的操作
try {
ctx.getResponse().getWriter().println(“Handling Async Servlet”);
} catch (IOException e) {}
//3. 异步Servlet处理完了调用异步上下文的complete方法
ctx.complete();
}
});
}
}
通过注解注册Servlet:@WebServlet注解,asyncSupported=true
表明当前的Servlet是一个异步Servlet。
Web应用程序需要调用Request对象的startAsync方法来拿到一个异步上下文AsyncContext。这个上下文保存了请求和响应对象。
Web应用需要开启一个新线程处理耗时操作:处理完成后调用AsyncContext#complete,通知Tomcat,请求已经处理完。
虽然异步Servlet允许用更长的时间来处理请求,但是也有超时限制的,默认是30秒,如果30秒内请求还没处理完,Tomcat会触发超时机制,向浏览器返回超时错误,如果这个时候你的Web应用再调用ctx.complete方法,会得到IllegalStateException。
==========================================================================
Tomcat在这个过程的关键:
startAsync方法
创建一个异步上下文AsyncContext对象,保存请求的中间信息,比如Request和Response对象等上下文信息。
这是因为Tomcat的工作线程