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;
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;
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);
}
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);
}
分享到:
相关推荐
哈希表--链表 哈希表--链表 哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表
57春节7天练---Day-1:数组和链表 数组和链表.pdf
通过分析和理解这个源码,你可以深入学习MFC如何与Windows API交互,以及如何设计和实现一个简单的游戏应用。这不仅有助于提升你的编程技巧,还能让你更好地理解面向对象编程在实际项目中的应用。
Linux运维-嵌入式物联网开发教程-获取链表结点个数和链表释放函数.mp4
uC/OS-II学习笔记—空闲链表和就绪链表 uC/OS-II是实时操作系统,任务控制块是uC/OS-II中最基本的数据结构,它负责管理任务的状态和信息。uC/OS-II将任务控制块分成两个链表来管理,这就是空闲链表和就绪链表。空闲...
3-软件课程设计补充知识-数组和链表 数组和链表.ppt
通过阅读和分析提供的各种链表源码,我们可以学习到如何在实际编程中有效地管理链表,包括内存分配、错误处理、效率优化等方面。这对于提高编程技能和理解数据结构的底层工作原理至关重要。 总的来说,这个资料包...
链表是一种基础且重要的数据结构,它在计算机科学中被广泛应用,特别是在算法和数据结构设计中。本题目的核心是“链表逆序”,这是一个常见的编程面试和笔试问题,主要考察程序员对链表操作的理解和实现能力。接下来...
在Linux内核中,哈希表是一种非常重要的...理解哈希表的内部工作原理和源码实现对于深入分析和优化内核代码至关重要。通过对内核源码的学习,我们可以更好地掌握哈希表的运作机制,并能够运用这些知识解决实际问题。
redis 剖析和注释技术博客源码专栏文章地址 新闻稿Redis剖析和注释(一源码)--- 链表结构 adlist.c 和 adlist.hRedis剖析和注释(二源码)--- 简单动态字符串 sds.c 和 sds.hRedis剖析和注释(三源码)--- Redis...
Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
这些链表的实现和操作构成了计算机程序中数据组织和处理的核心。掌握它们,不仅能帮助我们编写更加高效的代码,也是深入理解更复杂数据结构和算法的基础。总之,不同的链表结构各有特点,选择合适的链表结构,可以...
链表是一种重要的数据结构,广泛应用于计算机科学,特别是在C语言中。它不同于数组,因为数组在内存中是连续存储的,而链表的元素...通过提供的源码,你可以更深入地了解和实践这些操作,进一步提升C语言编程能力。
C语言实现的数据结构中的循环链表 包含源码(.c文件),linux环境下编译生成的可执行文件,头文件 ...清空和销毁循环链表 循环链表排序 循环链表的剔重 打印循环链表中所有元素(方便查看实验现象)
链表与数组对比,python链表实现和优缺势分析 python链表是一种常用的数据结构,它可以高效地存储和操作大量数据。与数组相比,链表有其独特的优缺点,本文将对python链表的实现、优缺点进行详细分析。 Python...
在编程领域,数据结构是构建复杂算法的基础,而链表...在理解和使用这个源码时,可以进一步思考如何提高链表操作的效率,例如通过使用迭代器或者模板来增强其通用性,或者考虑在多线程环境下如何保护链表的并发访问。
然后,请求会被传递到`Pipeline`(管道),这是一个基于链表的数据结构,包含了多个`Valve`(阀门)。每个阀门都可以对请求进行处理,如认证、日志记录、URL重写等。最后,请求会到达`ContainerBase`的`invoke()`...
链表是一种基础且重要的数据结构,它在计算机科学中扮演着关键角色,特别是在处理动态数据集合时。在给定的“各种形式的链表源码”压缩包中,重点是单链表、循环链表、双端链表的实现,以及可能使用数组或特定数据...
在Windows驱动程序开发中,链表是一种非常重要的数据结构,用于组织和管理内存中的对象。本视频教程将深入探讨如何在驱动程序中有效地利用链表。以下是对这一主题的详细阐述: 1. 链表基础 链表不同于数组,它是由...