Tomcat源码浅析
最近在学习tomcat源码,算是把tomcat的整个流程梳理通了。
从上图来看,tomcat把模块化使用到了极致,配合组件生命周期的管理,让代码看起来结构清晰,而且很容易进行业务扩展。
1.上图的接口Sever,Service,Connector,Container…..都是一个组件接口,这些组件的关系是,Server包含一个或多个Service,一个Service包含多个Container和与这个Container相关联的Connector,然后Container根据自身需要关联下面的Jasper,Naming…..等组件。Tomcat提供一键式启动和关闭服务,就是以刚刚所说的组件之间的关系来执行的,在启动一个组件的时候,会启动与其相关联的组件,这样会启动所有的组件,而客户端不需要关心其余组件的启动细节。
拿StandardServer的启动来举例:
protected void startInternal() throws LifecycleException {
fireLifecycleEvent(CONFIGURE_START_EVENT,
null);
//这个方法负责启动前的准备工作,用观察者模式实现
setState(LifecycleState.STARTING);
//标记组件的状态
globalNamingResources.start();
//相关联组件的启动
synchronized (servicesLock) {
for (int i = 0; i < services.length;
i++) {
services[i].start();
}
}
}
说明一下,组件的启动和关闭时,调用组件的start和stop方法,这两个是模板方法,模板方法中调用的startInternal方法由子类来实现。可以看到Sever会启动globalNamingResource组件和关联的Service组件,实现一键式功能。
2. startInternal方法的第一行
fireLifecycleEvent(CONFIGURE_START_EVENT,
null);
是为了做一些Sever启动前的准备工作,使用的是观察者模式来实现的。
Tomcat的观察者模式主要接口有:Lifecycle,LifecycleEvent,LifecycleListener,LifecycleSupport。
其中LifecycleListener是观察者,负责等待通知然后进行一些与发送的事件想匹配的操作,具体实现类有ContextConfig, HostConfig, EngineConfig,LifecycleEvent
是发送的事件,Lifecycle是被观察者(主题),具体的实现类有StandardServer,StandardContext等等组件,组件启动的时候,会将启动的动作封装成一个事件,然后调用观察者的回调方法,来进行相关操作,LifecycleSupport是一个生命周期的管理类,组件的观察者的管理委托LifecycleSupport来实现,因此所有的组件中都有一个LifecycleSupport的引用,在容器类的抽象类ContainerBase中代码如下:
protected LifecycleSupport lifecycle = new
LifecycleSupport(this);
public void addLifecycleListener(LifecycleListener listener) {
lifecycle.addLifecycleListener(listener);
}
public LifecycleListener[] findLifecycleListeners() {
return lifecycle.findLifecycleListeners();
public void removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
对观察者的管理以及动作的触发,都委托LifecycleSupport来实现。
这里主要做三件事:调用组件的启动方法,启动组件;调用子容器的启动方法,启动子容器;通知容器的观察者,使其执行相应的启动动作。每一层次的容器都这样启动,最终整个Tomcat启动完毕。
3. Tomcat中有四种不同的容器:
Engine:代表整个Catalina servle引擎
Host:代表虚拟主机
Context:代表某个web应用
Wrapper:代表某个应用中的servlet
这些容器都是父子的关系,Engine位于最顶层,一个Engine包含多个Host,一个Host(虚拟主机)包含多个Context(web应用),一个Context(web 应用)包含多个Wrapper(servlet),Wrapper位于最底层,没有孩子。当父容器启动时,相应的子容器也应该启动,子容器的子容器也启动。
4.好了,先说到这儿,还有一部分容器管道没有说,下次再介绍一下tomcat如何用管道阀来简化开发流程和增强程序扩展性。
Tomcat源码浅析的更多相关文章
- HashMap的源码浅析
一.HashMap 的数据结构 Java7 及之前主要是"数组+链表",到了 Java8 之后,就变成了"数组+链表+红黑树". 二.Java7 源码浅析: 在 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- svn工具安装下载Tomcat源码以及导入eclipse
安装 1.svn下载地址 https://tortoisesvn.net/downloads.html 2.语言包下载 3.先安装svn,在直接安装语言包 4.桌面右键可以看到相关svn信息 下载To ...
- Tomcat源码导入eclipse的步骤
Tomcat源码导入eclipse 一.下载源码 1. 进入Apache 官网:http://tomcat.apache.org/ 2. 在左边侧选择要下载的源码的版本. 3. 或者直接通过Ar ...
- tomcat源码分析(三)一次http请求的旅行-从Socket说起
p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...
- 75篇关于Tomcat源码和机制的文章
75篇关于Tomcat源码和机制的文章 标签: tomcat源码机制 2016-12-30 16:00 10083人阅读 评论(1) 收藏 举报 分类: tomcat内核(82) 版权声明:本文为 ...
- Eclipse导入Tomcat源码(转)
想要研究下Tomcat的体系结构或者源码,最好将Tomcat的源码导入到ide中,编写实例进行代码跟踪(debug). 这里参考了网上一些资料,将自己操作过程记个流水账. 准备: 1.Tomcat源码 ...
- [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat
概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...
随机推荐
- JS-输入数字输出大写中文
function(n) { var fraction = ['角', '分']; var digit = [ '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', ...
- mpvue重构小程序之坑点1
对于最近刚做的项目,想着用框架重新架构一遍,方便以后拓展,毕竟现在拓展方向非常大. 目前主要碰到两个略坑的问题: 1: 关于用户授权信息的按钮,原生是以下方式,使用bindgetuserinfo事件 ...
- 2018/7/16 YMOI模拟 NOIP2013D2T3华容道
题目描述 Description 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. ...
- GUI测试问题汇总
1.ajax实现的页面元素定位问题 最近在做项目的时候遇到一个问题,通过xpath定位到元素后做一个循环操作,第一循环可以正常执行,第二次循环后就报错,错误信息:Message: The elemen ...
- IDEA工具配置weblogic
1.首先打开IDEA,点击Run-Edit Configurations… 2.配置weblogic页面 2.1点击“+”号,选WeblogicServer-local 2.2红框的是新添加的服务,起 ...
- Google Compute Engine VM自动调节
现象:利用google云搭建VM服务,在搭建实例组有一个"自动调节"功能,可以自动添加/删除MV,当自动添加VM时可能新添加的VM就是一个新的VM,你部署的代码或者环境都没了.现在 ...
- 前言 openwrt简介
什么是openwrt?先看一下度娘怎么说. OpenWRT是一个高度模块化.高度自动化的嵌入式Linux系统,拥有强大的网络组件和扩展性,常常被用于工控设备.电话.小型机器人.智能家居.路由器以及VO ...
- Leetcode 337. 打家劫舍 III
题目链接 https://leetcode.com/problems/house-robber-iii/description/ 题目描述 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可 ...
- 使用Autofac实现依赖注入注入
依赖注入是什么意思? 依赖倒置 在软件设计原则中,有一种重要的思想叫做依赖倒置.它的核心思想是:不能让高层组件依赖底层组件,而且,不管高层组件和底层组件,两者都应依赖于抽象.那么,这个原则和我们上面的 ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架3
1:使用Framework工具类封装http请求 接上第二篇的步骤,现在在站点中使用封装好的组件,将framework编译好之后把dll提取出来,然后放到lib当中 在website中引用dll 接下 ...