码迷,mamicode.com
首页 > 其他好文 > 详细

jetty continuation的用法、实现、分析

时间:2014-05-20 18:22:18      阅读:1604      评论:0      收藏:0      [点我收藏+]

标签:实现   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模式:

bubuko.com,布布扣
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()
      {
// 异步事件
publicvoid onMyEvent(Object result)
         {
           continuation.setAttribute(
"results", results); // 传送results
           continuation.resume(); // 恢复连接
         }
      });
return; // or continuation.undispatch();
    }

// 连接恢复后返回结果
    sendMyResultResponse(response,results);
}
bubuko.com,布布扣

(2)Suspend/Complement模式:

bubuko.com,布布扣
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()
      {
// 异步事件
publicvoid onMyEvent(Object result)
         {
           sendMyResultResponse(continuation.getServletResponse(), results);
// 通过response返回results
           continuation.complete(); // 完成
         }
      });
    }
}


jetty continuation的用法、实现、分析,布布扣,bubuko.com

jetty continuation的用法、实现、分析

标签:实现   jetty continuation   分析   

原文地址:http://5148737.blog.51cto.com/5138737/1413682

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!