1
回答
servlet3.0异步 问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
public class RRWThread implements Runnable {
	
	private String rrw_txt=null;

	
	public RRWThread(String rrw_txt){
		this.rrw_txt=rrw_txt;
	}
	
	@Override
	public void run() {
		try{
		      System.out.println(rrw_txt);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

@WebServlet(name="async",urlPatterns="/async",asyncSupported=true)
public class AsyncServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		AsyncContext astx=null;
		try{
			astx=request.startAsync(request, response);
			astx.setTimeout(10*1000);

			
			

			new Thread(new RRWThread("Hello world")).start();
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}


}

为什么,线程中run方法已经执行完毕,Servlet不会立即结束呢,还要等待一段时间完全接收运行!

<无标签>
举报
jerry2012
发帖于4年前 1回/346阅
共有1个答案 最后回答: 4年前

第一点,任务要通过AsyncContext的start方法提交才正确不是自己去创建一个线程。

第二点,按照文档描述,你的这个Servlet是立即就结束了的,只是吧响应过程委派给AsyncContext去做了,这样就不用占Tomcat的处理Servlet的线程池,但如果本来就没有做Executor的配置,等于白搭。不要以为异步Servlet就是重新开个线程,响应就结束了,其实浏览器还在等着响应的。你说的等一段时间才结束,那是因为那个Timeout

--- 共有 4 条评论 ---
逝水fox回复 @jerry2012 : 你的就可以,把所有异步Servlet的代码,asyncSupported=true,AsyncContext这些都去掉。做一个普通的Servlet创建个线程后台启动就是了。 4年前 回复
jerry2012回复 @逝水fox : 你好,谢谢你的热心讲解,我先说说我的需求,我现在在做一个一键分享,同时分享到新浪微博,腾讯微博等。。数据通过移动端传过来,服务端接收到请求,使用异步发布到新浪微博腾讯微博!怎么实现异步,按我上面的代码行吗? 4年前 回复
逝水fox回复 @jerry2012 : Servlet3.0的异步的意思是结合NIO使用,使Http连接和处理过程不用和一个线程一一对应,对于浏览器来说,使不使用这个功能都没有本质区别,一样的是请求提交了就等待服务器响应 4年前 回复
jerry2012你的意思我这个还不算是异步,只能说开了一个线程?那我要怎么样才算是异步呢。 4年前 回复
顶部