Jetty7 Continuation 學習

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();
}spa

 

(4) 完成Http鏈接,一般用在異步事件回調函數裏返回Http Response時:
void myAsyncCallback(Object results)
{
    writeResults(continuation.getServletResponse(), results); // 將異步事件結果result,經過Response返回客戶端
    continuation.complete();
}設計

 

(5)註冊異步事件處理器
myAsyncHandler.register(continuation);
blog

 

(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();
    ...
事件

}get


兩種設計模式:Suspend/Resume模式,Suspend/Continue模式:
(1) Suspend/Resume模式:回調函數

Java代碼 複製代碼  收藏代碼
  1. void doGet(HttpServletRequest request, HttpServletResponse response)   
  2. {   
  3.      // 若是咱們須要異步方式獲得一個result,並放入request中   
  4.      Object results = request.getAttribute("results");   
  5.      if (results==null// 若是異步處理還沒有返回結果   
  6.       {   
  7.        final Continuation continuation = ContinuationSupport.getContinuation(request);   
  8.     
  9.        // 判斷是否超時   
  10.        if (continuation.isExpired())   
  11.        {   
  12.          // 返回超時Response   
  13.          sendMyTimeoutResponse(response);   
  14.          return;   
  15.        }   
  16.     
  17.        // 掛起HTTP鏈接   
  18.        continuation.suspend();    
  19.     
  20.        // 註冊一個異步事件處理器   
  21.        myAsyncHandler.register(new MyHandler()   
  22.        {   
  23.           // 異步事件   
  24.           public void onMyEvent(Object result)   
  25.           {   
  26.             continuation.setAttribute("results", results); // 傳送results   
  27.             continuation.resume(); // 恢復鏈接   
  28.           }   
  29.        });   
  30.        return// or continuation.undispatch();   
  31.      }   
  32.     
  33.      // 鏈接恢復後返回結果   
  34.      sendMyResultResponse(response,results);   
  35. it

(2)Suspend/Continue模式:

Java代碼 複製代碼  收藏代碼
  1. void doGet(HttpServletRequest request, HttpServletResponse response)   
  2. {   
  3.      final Continuation continuation = ContinuationSupport.getContinuation(request);   
  4.     
  5.        // 判斷是否超時   
  6.        if (continuation.isExpired())   
  7.        {   
  8.          // 返回超時Response   
  9.          sendMyTimeoutResponse(response);   
  10.          return;   
  11.        }   
  12.     
  13.        // 掛起HTTP鏈接   
  14.        continuation.suspend(response); // response被包裝   
  15.     
  16.        // 註冊一個異步事件處理器   
  17.        myAsyncHandler.register(new MyHandler()   
  18.        {   
  19.           // 異步事件   
  20.           public void onMyEvent(Object result)   
  21.           {   
  22.             sendMyResultResponse(continuation.getServletResponse(), results); // 經過response返回results   
  23.             continuation.complete(); // 完成   
  24.           }   
  25.        });   
  26.      }   
  27. }  

網上的好文章,往後備用。

相關文章
相關標籤/搜索