设为首页 收藏本站
查看: 673|回复: 0

[经验分享] Jetty7 Continuation 学习(一)

[复制链接]

尚未签到

发表于 2017-2-28 06:46:49 | 显示全部楼层 |阅读模式
  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/Continue模式:

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-348061-1-1.html 上篇帖子: 使用 IDEA 创建 Maven Web 项目 (异常)- Disconnected from the target VM, address: '127.0.0 下篇帖子: Openfire源代码调试、编译开发环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表