1. 程式人生 > >Servlet 3.0非同步特性初探

Servlet 3.0非同步特性初探

public class LoadClassServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException { System.out.println(" Start Servlet " + DateUtil.getDefaultFormatDate(System.currentTimeMillis())); System.out.println(" doPost() Thread Name : " + Thread.currentThread().getName()); System.out.println( " In doPost " + request); System.out.println(
" In doPost " + response); request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); // 開啟非同步週期 AsyncContext asyncContext = request.startAsync(); asyncContext.setTimeout(10*1000); asyncContext.start(new Runnable() { @Override
public void run() { try { System.out.println(" run() Thread Name : " + Thread.currentThread().getName()); // 模擬啟用執行緒非同步遞送訊號, 一般來說是一些耗時的操作 System.out.println(" Before Sleep " + DateUtil.getDefaultFormatDate(System.currentTimeMillis())); Thread.sleep(5 * 1000); System.out.println(" After Sleep " + DateUtil.getDefaultFormatDate(System.currentTimeMillis())); asyncContext.complete(); System.out.println(" After complete() " + DateUtil.getDefaultFormatDate(System.currentTimeMillis())); } catch (InterruptedException e) { e.printStackTrace(); } } }); System.out.println( " In AsyncContext " + asyncContext.getRequest() ); System.out.println( " In AsyncContext " + asyncContext.getResponse() ); asyncContext.addListener( new AsyncListener() { @Override public void onTimeout(AsyncEvent event) throws IOException { // ///////////////////////////////////// // 這個方法內一般會寫一些關於超時的邏輯 // 假設10s還沒有收到返回的訊號, 就將錯誤訊息 // 在這裡通過response物件返回給客戶端 // ///////////////////////////////////// System.out.println(" onTimeout() " + DateUtil.getDefaultFormatDate(System.currentTimeMillis())); event.getSuppliedResponse().getWriter().println(" timeout "); } @Override public void onStartAsync(AsyncEvent event) throws IOException { System.out.println(" onStartAsync() "); } @Override public void onError(AsyncEvent event) throws IOException { System.out.println(" onError() "); } @Override public void onComplete(AsyncEvent event) throws IOException { // /////////////////////////// // 這個方法無論怎樣都會被呼叫 // 不管是手動呼叫complete()方法 // 還是超時, 這個方法都會被執行 // /////////////////////////// System.out.println(" onComplete() " + DateUtil.getDefaultFormatDate(System.currentTimeMillis())); System.out.println(" onComplete() Thread Name : " + Thread.currentThread().getName()); System.out.println( " In AsyncEvent "+event.getSuppliedRequest() ); System.out.println( " In AsyncEvent "+event.getSuppliedResponse() ); event.getSuppliedResponse().getWriter().println(" complete "); } } ); System.out.println( " End of Servlet " + DateUtil.getDefaultFormatDate(System.currentTimeMillis())); } }