博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jetty continuation的用法、实现、分析
阅读量:5922 次
发布时间:2019-06-19

本文共 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)
{


   ...
   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
,如需转载请自行联系原作者
你可能感兴趣的文章
将HTML5 Canvas的内容保存为图片借助toDataURL实现
查看>>
maven安装和四大特性
查看>>
【OCP|052】OCP最新题库解析系列-3
查看>>
django 一对多,多对多关系解析
查看>>
配置percona mysql server 5.7基于gtid主主复制架构
查看>>
Windows2016的 IIS中配置PHP7运行环境
查看>>
浏览器image对象相关总结,(含PC浏览器,移动浏览器)
查看>>
实验报告五
查看>>
ORB0-SLAM2 system.h 阅读
查看>>
ueditor编辑器使用总结
查看>>
ssh整合之七注解结合xml形式
查看>>
[C puzzle book] Programming styles
查看>>
Javascript&Jquery获取浏览器和屏幕各种高度宽度方法总结及运用
查看>>
js懒加载
查看>>
小波变换 完美通俗解读【转载】
查看>>
python练习---校园管理系统
查看>>
小程序简介
查看>>
表格行的偶数与奇数
查看>>
基础数据类型之列表,元组
查看>>
1124 Raffle for Weibo Followers
查看>>