Javaee asyncContext对象在分派后创建新线程

Javaee asyncContext对象在分派后创建新线程,java,jakarta-ee,java-ee-6,asynchronous,Java,Jakarta 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 Serv

我有以下代码:

@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 ..
注意最后两行输出

我期待着(就像一个转发请求调度器)

似乎ac.dispatch创建了一个新线程。
有什么想法吗?
谢谢。

这种行为

方法在传递请求和响应后立即返回 对象到容器管理的线程,在该线程上执行分派操作 将执行。如果在 名为startAsync的容器启动的分派已返回到 对于集装箱,调度操作将延迟到 容器启动的分派已返回到容器


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

谢谢。第二部分“如果在调用startAsync..的容器启动分派之前调用此方法”,如果我正确读取它,则存在一个dispatcher对象,并且此对象(以及所有其他dispatcher对象)必须返回到其容器,然后此特定分派代码才能以异步模式启动?@yapkm01我的理解是:如果
dispatch()
调用是在处理请求的原始线程内执行的,而该线程尚未完成处理,那么容器将等待它结束,然后从
AsyncContext
启动
调度,servlet1中的ac.dispatch()仅在servlet1完成时启动。如果没有,则ac.dispatch()将不得不等待servlet1完成。Rite?@yapkm01当处理第一个请求的线程完成处理时,是的。我还有一个问题。根据asyncContext API,您可以在提交响应后调度Event。在普通的requestDispatcher(转发、包含)中,一旦提交了响应,就完成了事务。你不能再派遣了。但对于asyn,为什么允许这样做?这是因为它迎合了服务器推送,您可以将响应(如聊天)推送到客户机任意次数(我认为提交的响应与服务器推送无关)?
Servlet2 doGet 
Servlet1 doGet after dispatch ..