- 浏览: 987967 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
tomcat 7 源码分析-13 处理request的Valve和Valve的链表Pipeline
tomcat打开endpoint的监听对通过某种协议,通常下是http的信息进行解析,组装成request,接着给Http11Protocol(ProtocolHandler)和Http11Processor处理。
adapter.service(request, response);
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
最终选择具体的Valve类处理request并生成response。
Valve和Pipeline的关系:Pipeline是valve的链表,表头是first,表尾是basic,具体的实现是StandardPipeline。
valve的实现是ValveBase及其子类。
先看ValveBase的定义
- public abstract class ValveBase extends LifecycleMBeanBase
- implements Contained, Valve {
- //------------------------------------------------------ Constructor
- public ValveBase() {
- this ( false );
- }
- public ValveBase( boolean asyncSupported) {
- this .asyncSupported = asyncSupported;
- }
- ........
- /**
- * The next Valve in the pipeline this Valve is a component of.
- */
- protected Valve next = null ;
public abstract class ValveBase extends LifecycleMBeanBase implements Contained, Valve { //------------------------------------------------------ Constructor public ValveBase() { this(false); } public ValveBase(boolean asyncSupported) { this.asyncSupported = asyncSupported; } ........ /** * The next Valve in the pipeline this Valve is a component of. */ protected Valve next = null;
next就如同C和C++数据结构描述的指针,形如
struct valve{ valve * next };
StandardPipeline的具体实现
- public class StandardPipeline extends LifecycleBase
- implements Pipeline, Contained {
- ...............................
- /**
- * The basic Valve (if any) associated with this Pipeline.
- */
- protected Valve basic = null ;
- /**
- * The first valve associated with this Pipeline.
- */
- protected Valve first = null ;
public class StandardPipeline extends LifecycleBase implements Pipeline, Contained { ............................... /** * The basic Valve (if any) associated with this Pipeline. */ protected Valve basic = null; /** * The first valve associated with this Pipeline. */ protected Valve first = null;
StandardPipeline设置了两个哨兵,一个basic,一个是first。对链表的操作增加删除等,对哨兵有特殊处理的。
看个add的例子
- public void addValve(Valve valve) {
- // Validate that we can add this Valve
- if (valve instanceof Contained)
- ((Contained) valve).setContainer(this .container);
- // Start the new component if necessary
- if (getState().isAvailable()) {
- if (valve instanceof Lifecycle) {
- try {
- ((Lifecycle) valve).start();
- } catch (LifecycleException e) {
- log.error("StandardPipeline.addValve: start: " , e);
- }
- }
- }
- // Add this Valve to the set associated with this Pipeline
- if (first == null ) {
- first = valve;
- valve.setNext(basic);
- } else {
- Valve current = first;
- while (current != null ) {
- if (current.getNext() == basic) {
- current.setNext(valve);
- valve.setNext(basic);
- break ;
- }
- current = current.getNext();
- }
- container.fireContainerEvent(Container.ADD_VALVE_EVENT, valve);
- }
public void addValve(Valve valve) { // Validate that we can add this Valve if (valve instanceof Contained) ((Contained) valve).setContainer(this.container); // Start the new component if necessary if (getState().isAvailable()) { if (valve instanceof Lifecycle) { try { ((Lifecycle) valve).start(); } catch (LifecycleException e) { log.error("StandardPipeline.addValve: start: ", e); } } } // Add this Valve to the set associated with this Pipeline if (first == null) { first = valve; valve.setNext(basic); } else { Valve current = first; while (current != null) { if (current.getNext() == basic) { current.setNext(valve); valve.setNext(basic); break; } current = current.getNext(); } } container.fireContainerEvent(Container.ADD_VALVE_EVENT, valve); }
add一个元素是加在basic之前,处理pipeline的时候,是先取出first。
所以如果first==null,表面还没有pipeline种还没有元素,此时就先设置first。
不然,先找到basic以前的位置,将新的valve插入在basic之前,进行排队。
验证下可以看下面的remove操作
- public void removeValve(Valve valve) {
- Valve current;
- if (first == valve) {
- first = first.getNext();
- current = null ;
- } else {
- current = first;
- }
- while (current != null ) {
- if (current.getNext() == valve) {
- current.setNext(valve.getNext());
- break ;
- }
- current = current.getNext();
- }
- if (first == basic) first = null ;
- if (valve instanceof Contained)
- ((Contained) valve).setContainer(null );
- // Stop this valve if necessary
- if (getState().isAvailable()) {
- if (valve instanceof Lifecycle) {
- try {
- ((Lifecycle) valve).stop();
- } catch (LifecycleException e) {
- log.error("StandardPipeline.removeValve: stop: " , e);
- }
- }
- }
- try {
- ((Lifecycle) valve).destroy();
- } catch (LifecycleException e) {
- log.error("StandardPipeline.removeValve: destroy: " , e);
- }
- container.fireContainerEvent(Container.REMOVE_VALVE_EVENT, valve);
- }
public void removeValve(Valve valve) { Valve current; if(first == valve) { first = first.getNext(); current = null; } else { current = first; } while (current != null) { if (current.getNext() == valve) { current.setNext(valve.getNext()); break; } current = current.getNext(); } if (first == basic) first = null; if (valve instanceof Contained) ((Contained) valve).setContainer(null); // Stop this valve if necessary if (getState().isAvailable()) { if (valve instanceof Lifecycle) { try { ((Lifecycle) valve).stop(); } catch (LifecycleException e) { log.error("StandardPipeline.removeValve: stop: ", e); } } } try { ((Lifecycle) valve).destroy(); } catch (LifecycleException e) { log.error("StandardPipeline.removeValve: destroy: ", e); } container.fireContainerEvent(Container.REMOVE_VALVE_EVENT, valve); }
发表评论
-
tomcat7.0.8的高级应用-apr1.4.2安装
2011-03-24 17:16 956一 windows下安装 直接 ... -
tomcat 7 源码分析-14 tomcat的container设计
2011-03-11 19:18 1511tomcat 7 源码分析-14 tomca ... -
tomcat 7 源码分析-12 Enumeration枚举
2011-03-11 19:14 1225tomcat 7 源码分析-12 Enumeration枚举 ... -
tomcat 7 源码分析-11 tomcat对http协议的实现
2011-03-11 19:13 1372tomcat 7 源码分析-11 tomcat对http协议 ... -
tomcat 7 源码分析-10 线程池ThreadPoolExecutor
2011-03-11 19:12 2188tomcat 7 源码分析-10 线程池ThreadPool ... -
tomcat 7 源码分析-9 tomcat对ServerSocket的封装和使用
2011-03-11 19:11 1610tomcat 7 源码分析-9 tomcat对ServerS ... -
tomcat 7 源码分析-8 生命周期lifecycle和监听listener
2011-03-11 19:10 1352tomcat 7 源码分析-8 生命周期lifecycle和 ... -
tomcat 7 源码分析-7 server初始化中的JMX(DynamicMBean)再续
2011-03-11 19:09 1003tomcat 7 源码分析-7 server初始化中的JMX ... -
tomcat 7 源码分析-6 server初始化中的JMX(DynamicMBean)续
2011-03-11 19:08 1146tomcat 7 源码分析-6 server ... -
tomcat 7 源码分析-5 server初始化中的JMX(DynamicMBean)
2011-03-11 19:08 1332tomcat 7 源码分析-5 server初始化中的JMX ... -
tomcat 7 源码分析-4 server初始化背后getServer().init()
2011-03-11 19:06 1313tomcat 7 源码分析-4 server初始化背后get ... -
tomcat 7 源码分析-3 使用Digester读取xml文件实例化server
2011-03-11 19:05 1344tomcat 7 源码分析-3 使用Digester读取xm ... -
tomcat 7 源码分析-2 类加载ClassLoader
2011-03-11 19:04 1905tomcat 7 源码分析-2 类加载ClassLoader ... -
tomcat 7 源码分析-1 关于读取properties及注册系统properties
2011-03-11 19:02 1555tomcat 7 源码分析-1 关于读取properties ... -
Tomcat的四种基于HTTP协议的Connector性能比较
2011-03-11 17:58 1086Tomcat的四种基于HTTP协议的Connector性能比较 ...
相关推荐
哈希表--链表 哈希表--链表 哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表
57春节7天练---Day-1:数组和链表 数组和链表.pdf
数据结构--数组、单链表和双链表介绍以及双向链表 数组和链表.pdf
Linux运维-嵌入式物联网开发教程-获取链表结点个数和链表释放函数.mp4
python算法-数组和链表 数组和链表.pdf
uC/OS-II学习笔记—空闲链表和就绪链表
3-软件课程设计补充知识-数组和链表 数组和链表.ppt
C语言程序设计-职工信息管理系统(链表).docxC语言程序设计-职工信息管理系统(链表).docxC语言程序设计-职工信息管理系统(链表).docxC语言程序设计-职工信息管理系统(链表).docxC语言程序设计-职工信息管理系统(链表)...
采用数组标记方式实现,将绘图与逻辑实现独立。CSnake为标准C++代码,可单独提取出来对界面进行更换。
链表逆序链表逆序链表逆序链表逆序链表逆序链表逆序链表逆序链表逆序链表逆序链表逆序链表逆序链表逆序
Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
双链表-循环链表-静态链表.pdf
链表源码,链表源码,链表源码,链表源码,链表源码
链表构造
02-第2章线性表第7讲-双向链表和双向循环链表.pdf
Java单链表源码分析ds-算法 在 - 获取有关数据结构和算法的完整免费课程。 订阅频道以获取所有免费课程 - :folded_hands: 感谢您一直以来的厚爱和支持。 我虚心地请求您帮助这个频道发展更多,为此请点赞、分享和...
java数组和链表底层-链表的底层原理和实现 数组和链表.pdf
004-FreeRTOS202212-4005-将节点插入到链表的尾部
嵌入式学习-02-数据结构和算法 (链表)