7.3 Container 分析

7.3.1 ContainerBase的结构

Container 是 Tomcat 中容器的接口,其一共有四个子接口 Engine、Host、Context、Wrapper 一个默认实现类 ContainerBase,每个子接口都是一个容器,每个接口都有一个对应的 StandardXXX 实现类,并且都继承自 ContainerBase。同时 Container 还继承了 Lifecycle 借口,其和其子类都符合之前的生命周期管理模式。

Container 结构图

7.3.2 Container 的4个子容器

Container 的子容器是逐级包含的关系:

  • Engine:引擎,用于管理多个站点,一个Service 只能有一个 Engine。
  • Host:代表一个站点,也可以叫虚拟主机,通过配置 Host 就可以添加站点。
  • Context:代表一个应用程序,对应平时开发的一套程序,或者一个 WEB-INF 目录以及下面的 web.xml 文件。
  • Wrapper: 每个 Wrapper 封装一个 Servlet。


    Container 容器装配结构图

7.3.3 4种容器的配置方式‘

7.3.4 Container 的启动

Container 的启动通过 init 和 start 方法来完成,这两个方法会在 Tomcat 启动时被 Service 调用。Container 继承 Lifecycle 所以也是按照 Tomcat 的生命周期来管理,通过 init 和 start 进行初始化并调用子类的 initInternal 和 startInternal 方法进行具体处理,但是之前 Tomcat 整体结构的启动过程有所不同:

  • Container 的4个子容器有一个共同的父类 ContainerBase,这里定义了 Container 容器的 initInternal 和 startInternal 方法通用处理内容。
  • 除了最顶层容器的 init 是被 Service 调用的,子容器的 init 方法并不是在容器中逐层循环调用的,而是在执行 start 方法是时候通过状态判断还没有初始化才调用的(这是相对生命周期方法而言)。
  • start 方法除了在父容器的 startInternal 方法中调用,还会在父容器的添加子类的 addChild 方法中调用,这主要是因为 Context 和 Wrapper 是动态添加的,我们在站点目录下放一个应用的文件夹或者 war 包就可以添加一个 Context,在 web.xml 中配置一个 Servlet 就可以添加一个 Wrapper,所以 Context 和 Wrapper 都是在容器启动过程中才动态查找出来添加到相应的父容器中的

ContainerBase

containerBase 的** initInternal **方法主要是初始化 ThreadPollExecutor 类型的 startStopExecutor 属性,用于管理启动关闭的线程

initInternal 方法

containerBase 的 startInternal 方法主要做了5件事:

  • 如果有 Cluster 和 Realm 则调用其 start 方法;
  • 调用所有子容器的 start 方法启动子容器;
  • 调用管道的中 Valve 的 start 方法来启动管道;
  • 启动完成后将生命周期状态设置为 LifecycleState.STRATING 状态;
  • 启动后台线程定时处理一些事情。
startInternal 方法
  • Cluster 用于配置集群,作用是同步session。
  • Realm 是 Tomcat 的安全域,可以用来管理资源的访问权限。
  • 子容器使用 startStopExecutor 调用新线程来启动,可以提高效率。遍历future有两个作用:
    1. 其get方法是阻塞的,保证管道Pipeline 启动前容器就已经启动完成。
    2. 可以处理启动过程中遇到的异常。
  • 启动子容器的线程类型是 StartChild 是一个实现了Callable 的的内部类在 call 方法中调用注入子类的 start 方法。
  • 因为这里的 startInternal 是 ContainerBase 的方法,而所有的容器类都继承了 ContainerBase ,所以所有容器都会在启动过程中调用子类的 start 方法启动子容器

Engine

Service 会调用最顶层容器的 init 和 start 方法,如果使用了 Engine 就会调用 Engine 的生命周期方法

Engine 对应方法

Host

Host 的默认实现类 StandardHost 没有重写 initInternal 方法,所以会调用ContainerBase 的 initInternal 方法。重写了 startInternal 方法: startInternal 方法主要检查 Host 管道中是否有指定的 Valve(阀) ,如果没有则添加。

StandardHost startInternal 方法

Context

Context 的默认实现类 StandardContext 的 startInternal 方法会调用 web.xml 中定义的 Listener,另外还初始化了其中的 Filter 和 load-on-startup 的Servlet。

Standard Context startInternal 方法

Wrapper

StandardWrapper没有重写 initInternal 方法,重写了 startInternal 方法

  • 用 broadcaster 发送通知,主要用于 JMX;
  • 调用了父类 ContainerBase 的initInternal 方法;
  • 调用 setAvailable 方法让 Servlet 有效
Wrapper startInternal 方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容