java异步处理与监听器

本文介绍了Java中的异步处理,讨论了为何使用异步以节省线程资源。详细讲解了如何通过Servlet和Filter实现异步,并提供通过注解和web.xml配置两种方式声明asyncSupported。接着,阐述了异步处理的基本步骤,包括startAsync、setTimeout和start方法的使用。此外,文章还重点讨论了AsyncListener,解释了其四个核心方法的用途,并展示了添加监听器的关键代码。尽管内容简洁,但为实际项目开发提供了基础框架和用法的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机的内存是有限的。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() {

就是这样简单。还是那句,相应的事件,执行相应的函数。




---------------------------------------------------------------------所长,别开枪,是我,分割线----------------------------------------------------------------

写完了,每次写东西都是挺累的,但是写完又会感觉好开心。这篇文章的内容很空洞,只是讲了基本的框架和用法。以后再在实际项目开发的时候就可以基于此基础框架上使用了。

好吧,祝愿自己有个好睡眠,准备晚安了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值