计算机的内存是有限的。tomcat 7 中,最多的线程为200,。为了最大化,需要异步,这样可以节省线程。具体什么是异步,为什么要用异步,我不想多写了,会好累的,我怕写着写着就不想继续下去了。
异步有两种方式---Servlet和Filter。要实现异步,必须地显式声明asyncSupported=true;而这里,也有两种方法可以声明。第一种是注解。具体如下:
@WebServlet(name="AsyncDispatchServlet", urlPatterns={"/asyncDispatch"}, asyncSupported=true)
就这么一行代码,在类声明的前面。 如果这一种不是十分喜欢的话,不放考虑较为传统的方式----在部署文件web.xml设置。具体如下:
<servlet>
<servlet-name>AsyncComplete</servlet-name>
<servlet-class>servlet.AsyncCompleteServlet</servlet-class>
<async-supported>true</async-supported> ///这里
</servlet>
<servlet-mapping>
<servlet-name>AsyncComplete</servlet-name>
<url-pattern>/asyncComplete</url-pattern>
</servlet-mapping>
下面具体讲解一下怎么使用
支持异步处理的Servlet或者Filter可以通过在ServletRequest中调用startAsync方法来启动新的线程。startAsync有两个重载方法,常用的是不带参数的。调用之后会返回AsyncContext实例。话就不想多说了,还是直接上代码吧。
@WebServlet(name="AsyncDispatchServlet", urlPatterns={"/asyncDispatch"}, asyncSupported=true)
public class AsyncDispatchServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(final HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
final AsyncContext asyncContext = req.startAsync();
req.setAttribute("mainThread", Thread.currentThread().getName());
asyncContext.setTimeout(5000);
asyncContext.start(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch(InterruptedException e) {
e.printStackTrace();
}
req.setAttribute("workerThread", Thread.currentThread().getName());
// asyncContext.dispatch("/threadNames.jsp");
asyncContext.complete();
}
});
}
}
就用代码帮自己理清头绪。
final AsyncContext asyncContext = req.startAsync(); //返回AsyncContext 实例。
asyncContext.setTimeout(5000); //设置最多等待时间,超过时间的话会报错的。
asyncContext.start(new Runnable() { }; //开启一个线程,里面干嘛,自己决定。
当任务完成的时候,Runnale里面调用asyncContext.complete方法或者dispatch方法。后者可以传入一个页面。
小结一下编写异步的Servlet的步骤:
1. ServletRequest中调用startAsync方法,返回AsyncContext实例。
2.在AsyncContext中调用setTimeout方法,设置等待任务的时间。
3. 调用asyncContext.start方法,传递一个长时间执行的runnable。
4.任务完成的时候,通过runnable调用asyncContext.complete方法或者.dispatch方法
好吧,大功告成了!
--------------------------------------------------------------------------分割线--------------------------------------------------------------------
异步监听器,上一篇文章所说的,就是这节的重点。
jjavax.servlet.AsyncListener.。里面有四个函数。分别是onStartAsync, onComplete, onError, onTimeout,四个方法必须地实现。各有一个参数AsyncEvent,可以getAsyncContext获得实例。意思很明显,相应的时间出发相应的函数。在使用的时候,直接AsyncContext.addListener( //javax.servlet.AsyncListener的实例),其他的就没有什么两样了。关键代码如下
final AsyncContext asyncContext = request.startAsync();
asyncContext.setTimeout(5000);
asyncContext.addListener(new MyAsyncListener());
asyncContext.start(new Runnable() {
就是这样简单。还是那句,相应的事件,执行相应的函数。
---------------------------------------------------------------------所长,别开枪,是我,分割线----------------------------------------------------------------
写完了,每次写东西都是挺累的,但是写完又会感觉好开心。这篇文章的内容很空洞,只是讲了基本的框架和用法。以后再在实际项目开发的时候就可以基于此基础框架上使用了。
好吧,祝愿自己有个好睡眠,准备晚安了。