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. }  

网上的好文章,往后备用。

相关文章
相关标签/搜索