本文共 3546 字,大约阅读时间需要 11 分钟。
项目中用到了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)
{
(3) 恢复Http连接,一旦异步事件发生了,可以通过异步事件的回调函数来恢复Http连接
void myAsyncCallback(Object results)
{
(4) 完成Http连接,通常用在异步事件回调函数里返回Http Response时:
void myAsyncCallback(Object results)
{
(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模式:
(2)Suspend/Complement模式: