「Java」Servlet 3.0 の非同期処理を試してみる
Servlet 3.0 から非同期処理が実現できるようになったみたい。これで、非同期にサーブレット
コンテナ内で管理しているオブジェクトにアクセスできる。
参考にさせていただいたのは以下のページ。
http://www.atmarkit.co.jp/ait/articles/1106/10/news116.html
さっそく↑参考に実装してみた。
@WebServlet(name = "AsyncServletTest", value = "/AsyncServletTest", asyncSupported = true) public class AsyncServletTest extends HttpServlet { ( 略 ) protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("Hello AsyncServlet !!"); out.println("</body>"); out.println("</html>"); System.out.println("Servlet start"); AsyncContext asyncC = request.startAsync(); asyncC.start(new AsyncService(asyncC)); System.out.println("Servlet end"); } private static class AsyncService implements Runnable { AsyncContext ctx; public AsyncService(AsyncContext ctx) { this.ctx = ctx; } public void run() { try { System.out.println("AsyncService start"); System.out.println("AsyncService end"); ctx.complete(); } catch (Exception ex) { ex.printStackTrace(); } } } ( 略 )
非同期処理を行うには、以下のどちらかの方法があるみたい。
1. アノテーションで asyncSupported=true を設定する
2. web.xml で async-supported タグを仕様する
ポイントは、フィルターとか使っているなら、それらにも上記のどちらかの設定を行わないと非同期にならない。
上記実装を行なって、ブラウザからアクセスすると、コンソールに以下のような出力が行われる。
非同期で動作しているかな。
Servlet start Servlet end AsyncService start AsyncService end