jetty continuation的用法、实现、分析

项目中用到了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()
      {
// 异步事件
publicvoid 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()
      {
// 异步事件
publicvoid onMyEvent(Object result)
         {
           sendMyResultResponse(continuation.getServletResponse(), results); // 通过response返回results
           continuation.complete(); // 完成
         }
      });
    }
}

jetty continuation的用法、实现、分析,布布扣,bubuko.com

时间: 2024-10-12 04:13:20

jetty continuation的用法、实现、分析的相关文章

javascript中call,apply,bind的用法对比分析

这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成"借用“,"请求".想像一下如下的情景:你孤单一人漂泊在外,有急事想往家里打电话,可是很不巧,手机欠费了,或者没电了,或者掉坑里了,总之你的手机就是用

【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析

这一篇我们将会介绍java中try,catch,finally的用法 以下先给出try,catch用法: try { //需要被检测的异常代码 } catch(Exception e) { //异常处理,即处理异常代码 } 代码区如果有错误,就会返回所写异常的处理. 首先要清楚,如果没有try的话,出现异常会导致程序崩溃.而try则可以保证程序的正常运行下去,比如说: try { int i = 1/0; } catch(Exception e) { ........ } 一个计算的话,如果除数

C#中sizeof的用法实例分析

这篇文章主要介绍了C#中sizeof的用法,包括了常见的用法及注释事项,需要的朋友可以参考下. sizeof是C#中非常重要的方法,本文就以实例形式分析C#中sizeof的用法.分享给大家供大家参考.具体分析如下: 在C#中,sizeof用来计算类型的大小,单位是字节.有这样的一个类: 1 2 3 4 5 6 public class MyUglyClass { public char myChar1; public int myInt; public char myChar2; } 在客户端,

tcpdump常用用法+wireshark分析cap包

工作中的常用用法一.tcpdump常用用法: 1,-i 指定网口 -vnn 常用选项,显示详细信息并且不解析IP,端口 :抓取某个网口上发往或来自某个IP的报文tcpdump -i ethX host 192.168.1.100 -vnn 2,可以用or 或者and 连接多个过滤条件,port前的tcp表示tcp协议,也可为udp:抓取某个网口上发往或来自某个IP.并且指定端口的报文tcpdump -i ethX host 192.168.1.100 and tcp port 22(端口号) -

Python shutil模块用法实例分析

本文主要介绍了Python shutil模块用法,结合实例形式分析了Python使用shutil模块操作文件拷贝的相关实现技巧与注意事项,需要的朋友可以参考下: shutil模块 主要作用与拷贝文件用的. 1.shutil.copyfileobj(文件1,文件2):将文件1的数据覆盖copy给文件2. 1 import shutil 2 f1 = open("1.txt",encoding="utf-8") 3 f2 = open("2.txt"

Java List 用法代码分析 非常详细

Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引 ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步 LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快) Vector:底层是数组数据结构 线程同步(数组长度

Python关于self用法重点分析

在介绍Python的self用法之前,先来介绍下Python中的类和实例-- 我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示.而实例是根据类创建出来的一个个具体的"对象",每一个对象都从类中继承有相同的方法,但各自的数据可能不同. 1.以Student类为例,在Python中,定义类如下: class Student(object): pass12(Object)表示该类从哪个类继承

PHP观察者模式定义与用法实例分析_php技巧 - PHP

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 本文实例讲述了PHP观察者模式定义与用法.分享给大家供大家参考,具体如下: 我理解的观察者模式就是,当我们触发一个事件的时候,想要把这个操作告诉给我想要告诉的对象,让他们都执行这个操作,就是将他们绑定到这个事件下. 1.定义一个基类(用于添加观察者也就是我想要通知的对象,还有通知观察者) EventGenerator.php <?php abstract class EventGenerator { //存储观察者,

Spring中@Transactional用法深度分析之一

引言: 在Spring中@Transactional提供一种控制事务管理的快捷手段,但是很多人都只是@Transactional简单使用,并未深入了解,其各个配置项的使用方法,本文将深入讲解各个配置项的使用. 1.  @Transactional的定义 Spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题.在现实中,实际的问题往往比我们预期的要复杂很多,这就要求对@Transactional有深入的了解,以来应对复杂问题.