`
zhaohaolin
  • 浏览: 1012301 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

tomcat 7 源码分析-13 处理request的Valve和Valve的链表Pipeline

阅读更多

tomcat 7 源码分析-13 处理request的Valve和Valve的链表Pipeline

 

tomcat打开endpoint的监听对通过某种协议,通常下是http的信息进行解析,组装成request,接着给Http11Protocol(ProtocolHandler)和Http11Processor处理。

Java代码  收藏代码
  1. adapter.service(request, response);  
adapter.service(request, response);
 
Java代码  收藏代码
  1. connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);  
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);

 最终选择具体的Valve类处理request并生成response。

Valve和Pipeline的关系:Pipeline是valve的链表,表头是first,表尾是basic,具体的实现是StandardPipeline。

valve的实现是ValveBase及其子类。

先看ValveBase的定义

Java代码  收藏代码
  1. public   abstract   class  ValveBase  extends  LifecycleMBeanBase  
  2.     implements  Contained, Valve {  
  3.   
  4.     //------------------------------------------------------ Constructor   
  5.       
  6.     public  ValveBase() {  
  7.         this ( false );  
  8.     }  
  9.       
  10.     public  ValveBase( boolean  asyncSupported) {  
  11.         this .asyncSupported = asyncSupported;  
  12.     }  
  13.   
  14.    ........  
  15.   
  16.   
  17.     /**  
  18.      * The next Valve in the pipeline this Valve is a component of.  
  19.      */   
  20.     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++数据结构描述的指针,形如

Cpp代码  收藏代码
  1. struct  valve{  
  2.   
  3. valve * next  
  4. };  
struct valve{

valve * next
};

 StandardPipeline的具体实现

Java代码  收藏代码
  1. public   class  StandardPipeline  extends  LifecycleBase  
  2.         implements  Pipeline, Contained {  
  3.   
  4. ...............................  
  5.   
  6.     /**  
  7.      * The basic Valve (if any) associated with this Pipeline.  
  8.      */   
  9.     protected  Valve basic =  null ;  
  10.   
  11.   
  12.     /**  
  13.      * The first valve associated with this Pipeline.  
  14.      */   
  15.     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的例子

Java代码  收藏代码
  1. public   void  addValve(Valve valve) {  
  2.   
  3.     // Validate that we can add this Valve   
  4.     if  (valve  instanceof  Contained)  
  5.         ((Contained) valve).setContainer(this .container);  
  6.   
  7.     // Start the new component if necessary   
  8.     if  (getState().isAvailable()) {  
  9.         if  (valve  instanceof  Lifecycle) {  
  10.             try  {  
  11.                 ((Lifecycle) valve).start();  
  12.             } catch  (LifecycleException e) {  
  13.                 log.error("StandardPipeline.addValve: start: " , e);  
  14.             }  
  15.         }  
  16.     }  
  17.   
  18.     // Add this Valve to the set associated with this Pipeline   
  19.     if  (first ==  null ) {  
  20.         first = valve;  
  21.         valve.setNext(basic);  
  22.     } else  {  
  23.         Valve current = first;  
  24.         while  (current !=  null ) {  
  25. if  (current.getNext() == basic) {  
  26.     current.setNext(valve);  
  27.     valve.setNext(basic);  
  28.     break ;  
  29. }  
  30. current = current.getNext();  
  31.   
  32.     }  
  33.       
  34.     container.fireContainerEvent(Container.ADD_VALVE_EVENT, valve);  
  35. }  
    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操作

Java代码  收藏代码
  1. public   void  removeValve(Valve valve) {  
  2.   
  3.     Valve current;  
  4.     if (first == valve) {  
  5.         first = first.getNext();  
  6.         current = null ;  
  7.     } else  {  
  8.         current = first;  
  9.     }  
  10.     while  (current !=  null ) {  
  11.         if  (current.getNext() == valve) {  
  12.             current.setNext(valve.getNext());  
  13.             break ;  
  14.         }  
  15.         current = current.getNext();  
  16.     }  
  17.   
  18.     if  (first == basic) first =  null ;  
  19.   
  20.     if  (valve  instanceof  Contained)  
  21.         ((Contained) valve).setContainer(null );  
  22.   
  23.     // Stop this valve if necessary   
  24.     if  (getState().isAvailable()) {  
  25.         if  (valve  instanceof  Lifecycle) {  
  26.             try  {  
  27.                 ((Lifecycle) valve).stop();  
  28.             } catch  (LifecycleException e) {  
  29.                 log.error("StandardPipeline.removeValve: stop: " , e);  
  30.             }  
  31.         }  
  32.     }  
  33.     try  {  
  34.         ((Lifecycle) valve).destroy();  
  35.     } catch  (LifecycleException e) {  
  36.         log.error("StandardPipeline.removeValve: destroy: " , e);  
  37.     }  
  38.       
  39.     container.fireContainerEvent(Container.REMOVE_VALVE_EVENT, valve);  
  40. }  
    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);
    }
 
分享到:
评论

相关推荐

    哈希表------链表

    哈希表--链表 哈希表--链表 哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表

    57春节7天练---Day-1:数组和链表 数组和链表.pdf

    57春节7天练---Day-1:数组和链表 数组和链表.pdf

    MFC贪吃蛇源码--非链表

    通过分析和理解这个源码,你可以深入学习MFC如何与Windows API交互,以及如何设计和实现一个简单的游戏应用。这不仅有助于提升你的编程技巧,还能让你更好地理解面向对象编程在实际项目中的应用。

    Linux运维-嵌入式物联网开发教程-获取链表结点个数和链表释放函数.mp4

    Linux运维-嵌入式物联网开发教程-获取链表结点个数和链表释放函数.mp4

    uC/OS-II学习笔记—空闲链表和就绪链表

    uC/OS-II学习笔记—空闲链表和就绪链表 uC/OS-II是实时操作系统,任务控制块是uC/OS-II中最基本的数据结构,它负责管理任务的状态和信息。uC/OS-II将任务控制块分成两个链表来管理,这就是空闲链表和就绪链表。空闲...

    3-软件课程设计补充知识-数组和链表 数组和链表.ppt

    3-软件课程设计补充知识-数组和链表 数组和链表.ppt

    链表的实现 各种链表源码

    通过阅读和分析提供的各种链表源码,我们可以学习到如何在实际编程中有效地管理链表,包括内存分配、错误处理、效率优化等方面。这对于提高编程技能和理解数据结构的底层工作原理至关重要。 总的来说,这个资料包...

    笔试题之链表逆序A->B->C to C->B>A

    链表是一种基础且重要的数据结构,它在计算机科学中被广泛应用,特别是在算法和数据结构设计中。本题目的核心是“链表逆序”,这是一个常见的编程面试和笔试问题,主要考察程序员对链表操作的理解和实现能力。接下来...

    Linux内核分析与应用课件第1章(四)源码分析-内核中的哈希表.pdf

    在Linux内核中,哈希表是一种非常重要的...理解哈希表的内部工作原理和源码实现对于深入分析和优化内核代码至关重要。通过对内核源码的学习,我们可以更好地掌握哈希表的运作机制,并能够运用这些知识解决实际问题。

    Linux内核2.6.14源码分析

    Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)

    C语言-链表基本操作源码

    链表是一种重要的数据结构,广泛应用于计算机科学,特别是在C语言中。它不同于数组,因为数组在内存中是连续存储的,而链表的元素...通过提供的源码,你可以更深入地了解和实践这些操作,进一步提升C语言编程能力。

    数据结构-循环链表-C语言实现循环链表功能-数据结构学习

    C语言实现的数据结构中的循环链表 包含源码(.c文件),linux环境下编译生成的可执行文件,头文件 ...清空和销毁循环链表 循环链表排序 循环链表的剔重 打印循环链表中所有元素(方便查看实验现象)

    python的链表与数组对比,优势和劣势 数组和链表.pdf

    链表与数组对比,python链表实现和优缺势分析 python链表是一种常用的数据结构,它可以高效地存储和操作大量数据。与数组相比,链表有其独特的优缺点,本文将对python链表的实现、优缺点进行详细分析。 Python...

    双向循环链表源码

    在编程领域,数据结构是构建复杂算法的基础,而链表...在理解和使用这个源码时,可以进一步思考如何提高链表操作的效率,例如通过使用迭代器或者模板来增强其通用性,或者考虑在多线程环境下如何保护链表的并发访问。

    Tomcat源码研究

    然后,请求会被传递到`Pipeline`(管道),这是一个基于链表的数据结构,包含了多个`Valve`(阀门)。每个阀门都可以对请求进行处理,如认证、日志记录、URL重写等。最后,请求会到达`ContainerBase`的`invoke()`...

    各种形式的链表源码

    链表是一种基础且重要的数据结构,它在计算机科学中扮演着关键角色,特别是在处理动态数据集合时。在给定的“各种形式的链表源码”压缩包中,重点是单链表、循环链表、双端链表的实现,以及可能使用数组或特定数据...

    Windows驱动编程视频教程-在驱动中使用链表

    在Windows驱动程序开发中,链表是一种非常重要的数据结构,用于组织和管理内存中的对象。本视频教程将深入探讨如何在驱动程序中有效地利用链表。以下是对这一主题的详细阐述: 1. 链表基础 链表不同于数组,它是由...

    Go-LinkedList一个简单的双链表实现

    本文将深入探讨Go语言中的双链表实现,以标题"Go-LinkedList一个简单的双链表实现"为例,我们将分析双链表的设计、操作以及其在实际应用中的价值。 双链表是一种线性数据结构,每个节点包含两个指针,分别指向前后...

    完整的C 链表实例源码.rar

    链表是一种基础且重要的数据结构,在计算机科学中广泛应用于各种算法和程序设计中。这个"完整的C 链表实例源码"提供了实现链表操作的模板化...开发者可以通过分析和运行这个源码,深入理解链表的工作原理和操作技巧。

Global site tag (gtag.js) - Google Analytics