我有以下代码:
@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 :(得分:0)
此方法在传递请求和响应后立即返回 对象到容器托管线程,对其进行调度操作 将被执行。如果在此之前调用此方法 已调用startAsync的容器启动的调度已返回 容器,调度操作将延迟到之后 容器启动的调度已返回容器。
这是有道理的,因为您处于异步上下文中。