2013-10-22 28 views
0

我有以下代码:的JavaEE asyncContext对象调度后,创建一个新的线程

@WebServlet(urlPatterns="/Servlet1", asyncSupported=true) 
public class Servlet1 extends HttpServlet { 
private static final long serialVersionUID = 1L; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     System.out.println("Servlet1 doGet .."); 
     AsyncContext ac = request.startAsync(); 
     System.out.println(request.isAsyncStarted()); 
     ac.dispatch("/Servlet2"); 
     System.out.println("Servlet1 doGet after dispatch .."); 
} 

} 

@WebServlet("/Servlet2") 
public class Servlet2 extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     System.out.println("Servlet2 doGet .."); 
} 

} 

注意以下的输出:

Servlet1 doGet .. 
true 
Servlet1 doGet after dispatch .. 
Servlet2 doGet .. 

通知最后2条输出线?

我期待(就像前请求调度器)

Servlet2 doGet 
Servlet1 doGet after dispatch .. 

好像ac.dispatch创造了一个新的线程。
对此有何想法?
谢谢。

回答

0

行为是described in the javadoc

方法传递的请求和响应 对象到容器托管线程,将在其上执行的调度操作 后立即返回。如果在调用startAsync的容器启动调度 容器之前调用此方法,则调度操作将被延迟到 容器启动的调度返回到容器之后。

这很有道理,因为您处于异步环境中。

+0

谢谢。第二部分'如果此方法在容器启动的调用之前调用startAsync ..',如果我正确读取它,则会有一个调度程序对象,并且此对象(加上所有其他调度程序对象)必须返回到其容器在这个特定的调度代码之前可以在asychnronous模式下启动?我有这个对吗? – yapkm01

+0

@ yapkm01我的理解是:如果dispatch()调用是在原​​始线程内部处理请求并且该线程还没有完成处理,那么容器将等待它结束,然后再从该线程启动'dispatch' 'AsyncContext'。 –

+0

因此,简而言之(基于我的代码),servlet1中的ac.dispatch()只会在servlet1完成时启动。如果不是ac.dispatch()将不得不等到servlet1完成。仪式? – yapkm01

相关问题