0

我有以下代码:

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

4

1 回答 1

0

该行为在 javadoc 中进行了描述

方法在将请求和响应对象传递给容器管理的线程后立即返回,将在该线程上执行分派操作。如果在容器发起的调用 startAsync 的 dispatch 返回容器之前调用该方法,则 dispatch 操作会延迟到容器发起的 dispatch 返回容器之后。

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

于 2013-10-22T16:16:13.443 回答