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 を呼び出したコンテナー起動ディスパッチがコンテナーに戻る前にこのメソッドが呼び出された場合、コンテナー起動ディスパッチがコンテナーに戻るまで、ディスパッチ操作は遅延されます。

非同期コンテキストにいるため、これは理にかなっています。

于 2013-10-22T16:16:13.443 に答える