読者です 読者をやめる 読者になる 読者になる

「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