项目中用到了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模式:
{
// 如果我们需要异步方式得到一个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模式:
{
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(); // 完成
}
});
}
}