zoukankan      html  css  js  c++  java
  • Jetty7 Continuation 学习(一)

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


     

  • 相关阅读:
    JVM调优总结(八)-典型配置举例2
    JVM调优总结(七)-典型配置举例1
    ajax---异步请求对象的属性和方法
    ajax----发送异步请求的步骤
    ajax---获取XMLHttpReuquest 对象
    ajax--参数默认值问题
    ajax--参数映射方式实现阴影效果
    ajax-简单参数方法实现阴影效果
    ajax之阴影效果实现(对象函数方法)
    ajax对象方法的使用
  • 原文地址:https://www.cnblogs.com/kylindai/p/1593749.html
Copyright © 2011-2022 走看看