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创造了一个新的线程。
对此有何想法?
谢谢。
谢谢。第二部分'如果此方法在容器启动的调用之前调用startAsync ..',如果我正确读取它,则会有一个调度程序对象,并且此对象(加上所有其他调度程序对象)必须返回到其容器在这个特定的调度代码之前可以在asychnronous模式下启动?我有这个对吗? – yapkm01
@ yapkm01我的理解是:如果dispatch()调用是在原始线程内部处理请求并且该线程还没有完成处理,那么容器将等待它结束,然后再从该线程启动'dispatch' 'AsyncContext'。 –
因此,简而言之(基于我的代码),servlet1中的ac.dispatch()只会在servlet1完成时启动。如果不是ac.dispatch()将不得不等到servlet1完成。仪式? – yapkm01