jetty continuation的用法、实现、分析

简介:

项目中用到了jetty continuation,但是一直不知道continuation到底有什么作用,下面这个文章讲解的很清楚,附上自己的一点见解:

1. http请求的处理逻辑是什么?

当一个HTTP请求到来的时候,server分配一个单独的线程处理这个请求,请求完成之后再返回response给请求端。这个过程中 server处理线程一般是不释放,即使是什么都没有干。如果这个请求过程很久,并且server的请求数很大的时候,那么线程池是必定长时间处于“满”的状态。

2.continuation的定义是什么?

Continuation是一种可以使HTTP请求可以被暂时挂起,并且当挂起超时或非同步的事件发生时,被挂起的HTTP请求可以被重新恢复的机制


3.这两者之间有什么联系吗?

如果理解了上面两个问题的话,那么continuation就可以解决第一个提出来的问题了:

(1)server的请求数量大,那我们就将收到的请求挂载,分配给它的线程就可以腾出来接受其他的请求数,被挂载的request只是continuation被标志位suspend,仍然可以继续进行其他的逻辑处理。

(2)当被挂载的请求处理完毕,如何返回呢?由continuation的定义可以知道,超时或异步事件发生时,请求对应的continuation的suspend状态可以恢复,所以我们是需要定义一个异步时间的。

ok,理解了上面的,我觉得差不多就了解了continuation的作用了,下面给出相关的API


文档转自 http://www.cnblogs.com/kylindai/archive/2009/11/01/1593749.html

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)监听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/Complement模式:

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();  //  完成
         }
      });
    }
}


     本文转自布拉君君 51CTO博客,原文链接: http://blog.51cto.com/5148737/1413682 ,如需转载请自行联系原作者




相关文章