天天看點

Jetty7 Continuation 學習(一)

Jetty7釋出了,Jetty7支援servlet 2.5,且對Jetty6做了很大的重構,使之更合理更高效。

Jetty的Http異步處理模式,包括Jetty HttpClient(異步的HttpClient),Jetty Continuation(異步的Http Request/Respoinse),都是很吸引人的技術,有很多很好的應用,比如線上聊天室,實時股票行情表,異步Ajax代理等等,都可以用Jetty的異步處理模式來實作。

趁Jetty7的到來,趕緊享受一下這道技術美味。

Jetty Continuation 實際上是一種異步Http技術,他能讓Http連接配接挂起,直到逾時或者異步事件發生時,Http連接配接可以恢複。Jetty Continuation 的技術應用起來不複雜,有幾個關鍵的API,和兩種設計模式:

API:

(1) 得到Continuation

Continuation continuation = ContinuationSupport.getContinuation(request);

(2) 挂起Http請求

void doGet(HttpServletRequest request, HttpServletResponse response)

{

    ...

    continuation.setTimeout(long);  // 可選:設定continuation 逾時

    continuation.suspend();

    ...

}

(3) 恢複Http連接配接,一旦異步事件發生了,可以通過異步事件的回調函數來恢複Http連接配接

void myAsyncCallback(Object results)

{

    continuation.setAttribute("results", results);

    continuation.resume();

}

(4) 完成Http連接配接,通常用在異步事件回調函數裡傳回Http Response時:

void myAsyncCallback(Object results)

{

    writeResults(continuation.getServletResponse(), results); // 将異步事件結果result,通過Response傳回用戶端

    continuation.complete();

}

(5)注冊異步事件處理器

myAsyncHandler.register(continuation);

(6)監聽continuation事件

void doGet(HttpServletRequest request, HttpServletResponse response)

{

    ...

    Continuation continuation = ContinuationSupport.getContinuation(request);

    continuation.addContinuationListener(new ContinuationListener()

    {

      public void onTimeout(Continuation continuation) { ... } // 逾時事件

      public void onComplete(Continuation continuation) { ... } // 完成事件

    });

    continuation.suspend();

    ...

}

兩種設計模式:Suspend/Resume模式,Suspend/Continue模式:

(1) Suspend/Resume模式:

void doGet(HttpServletRequest request, HttpServletResponse response)
{
     // 如果我們需要異步方式得到一個result,并放入request中
     Object results = request.getAttribute("results");
     if (results==null) // 如果異步處理尚未傳回結果
      {
       final Continuation continuation = ContinuationSupport.getContinuation(request);
 
       // 判斷是否逾時
       if (continuation.isExpired())
       {
         // 傳回逾時Response
         sendMyTimeoutResponse(response);
         return;
       }
 
       // 挂起HTTP連接配接
       continuation.suspend(); 
 
       // 注冊一個異步事件處理器
       myAsyncHandler.register(new MyHandler()
       {
          // 異步事件
          public void onMyEvent(Object result)
          {
            continuation.setAttribute("results", results); // 傳送results
            continuation.resume(); // 恢複連接配接
          }
       });
       return; // or continuation.undispatch();
     }
 
     // 連接配接恢複後傳回結果
     sendMyResultResponse(response,results);
}

           

(2)Suspend/Continue模式:

void doGet(HttpServletRequest request, HttpServletResponse response)
{
     final Continuation continuation = ContinuationSupport.getContinuation(request);
 
       // 判斷是否逾時
       if (continuation.isExpired())
       {
         // 傳回逾時Response
         sendMyTimeoutResponse(response);
         return;
       }
 
       // 挂起HTTP連接配接
       continuation.suspend(response); // response被包裝
 
       // 注冊一個異步事件處理器
       myAsyncHandler.register(new MyHandler()
       {
          // 異步事件
          public void onMyEvent(Object result)
          {
            sendMyResultResponse(continuation.getServletResponse(), results); // 通過response傳回results
            continuation.complete(); // 完成
          }
       });
     }
}

 

           

繼續閱讀