Javaee asyncContext对象在调度后创建新线程

时间:2013-10-22 16:13:12

标签: java java-ee java-ee-6 asynchronous

我有以下代码:

@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创建了一个新线程 对此有何看法?
感谢。

1 个答案:

答案 0 :(得分:0)

行为为described in the javadoc

  

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

这是有道理的,因为您处于异步上下文中。