Tomcat源码分析之—具体启动流程分析
从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息、Catalina.base信息,在initClassLoaders方法中初始化类加载器,然后通过反射初始化org.apache.catalina.startup.Catalina作为catalina守护进程;
一、load

Bootstrap中load流程:
- 反射调用Catalina的load方法。
- 调用Catalina的initDirs()、initNaming()初始化catalinaHome、catalina.useNaming等信息。
- 创建Digester对象,调用createStartDigester创建与配置Digester信息,载入Server.xml配置文件,使用Digester解析Server.xml文件,并根据Server文件的配置信息创建Server、Service、Engine、Host、Valve、Realm、Connector、Listener、Resource等对象。
- 设置当前Catalina为StandardServer的Catalina对象,调用initStreams。
- 调用StandardServer的init方法初始化Server。
调用Bootstrap的load方法中用反射调用Catalina的load,在Catalina中初始化initDirs()路径信息,调用createStartDigester创建与配置Digester信息,载入Server.xml配置文件,使用Digester解析Server.xml文件,并根据Server文件的配置信息创建Server、Service、Engine、Host、Valve、Realm、Connector、Listener、Resource等对象,及对象的关联关系(Digester的相关知识这里就不介绍了)。由于在Digester解析Server.xml的时候已经创建Server对象,所以这里也将server的init方法初始化Server对象,至此Bootstrap执行完成,准确的说是Catalina的load载入完成。
二、start
接着将调用Bootstrap的start方法启动容器,在start方法中也是通过反射调用Catalina的start方法,如下图:

然后在Catalina中调用StandardServer对象的start方法启动server,在start方法中就会像我们在Tomcat源码分析之—组件启动实现分析那节中分析的一样,通过Tomcat的生命周期管理观察者模式实现对Service、Connector、Engine、Host、Context、Wrapper、Pipeline的启动,这里就不重复在讲解了;
三、注册关闭钩子(ShutdownHook)
if (shutdownHook == null) {
shutdownHook = new CatalinaShutdownHook();
}
Runtime.getRuntime().addShutdownHook(shutdownHook);
四、调用await()与stop(),等候关闭请求与stop容器

调用Catalina的await实际上就调用StandardServer的await如上图,等候<Server port="8006" shutdown="SHUTDOWN">在Server 8006端口上的SHUTDOWN关闭Tomcat请求。
接收到SHUTDOWN请求后调用StandardServer的stop方法与destroy方法如下图:

生命周期管理观察者模式实现对Service、Connector、Engine、Host、Context、Wrapper、Pipeline的关闭与释放资源
五、总结
Tomcat的启动与关闭流程到此就结束了,整个流程还是比较清晰的,只要清除Tomcat的启动流程也自然就懂得了Tomcat的关闭流程,Tomcat中使用了观察者模式对Tomcat的生命周期进行了管理,了解LifecycleBase、Lifecycle、LifecycleSupport等相关类也就了解了整个流程,整个流程的时序图如下:

Tomcat启动与关闭时序图
文章首发地址:Solinx
http://www.solinx.co/archives/121
Tomcat源码分析之—具体启动流程分析的更多相关文章
- Cocos2dx源码赏析(1)之启动流程与主循环
Cocos2dx源码赏析(1)之启动流程与主循环 我们知道Cocos2dx是一款开源的跨平台游戏引擎,而学习开源项目一个较实用的办法就是读源码.所谓,"源码之前,了无秘密".而笔者 ...
- [Abp vNext 源码分析] - 1. 框架启动流程分析
一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...
- ASP.NET Core MVC 源码学习:MVC 启动流程详解
前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...
- ThinkPHP5.0源码学习之框架启动流程
ThinkPHP5框架的启动流程图如下: ThinkPHP5的启动流程按照文件分为三步: 1.请求入口(public/index.php) 2.框架启动(thinkphp/start.php) 3.应 ...
- 简单读!tomcat源码(一)启动与监听
tomcat 作为知名的web容器,很棒! 本文简单了从其应用命令开始拆解,让我们对他有清晰的了解,揭开神秘的面纱!(冗长的代码流水线,给你一目了然) 话分两头: 1. tomcat是如何启动的? 2 ...
- Android -- Camera源码简析,启动流程
com.android.camera.Camera.java,主要的实现Activity,继承于ActivityBase. ActivityBase 在ActivityBase中执行流程: onCre ...
- wordpress学习二:源码目录结构和启动流程
wordpress安装后的文件目录如下: 其中的主要目录和文件用途介绍如下: wp-admin:用于进行博客后台设置的功能目录 wp-content: wordpress的 主题,插件和本地化的存储目 ...
- Spring源码解析02:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...
- Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...
随机推荐
- oracle分组查询实例ORA-00979和ORA-00937错误分析
select J.ZWJGH,J.CZZXBH,J.JZZT,J.CWNY,J.JZPZH sum(J.FSE)<!-- 聚合函数字段没在分组条件中--> from JZPZXX J &l ...
- hdu-4496-D-City
D-City Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- C++/C互相调用
C调用C++: 在C++程序中使用extern "C"{}来明确要求C++编译器不要对被调用的C++函数进行换名处理, 当然,这会导致函数无法重载 C++调用C: 在C++程序中使 ...
- sso demo 取消https (cas)
基本配置 参考之前得随笔 http://www.cnblogs.com/rocky-fang/p/5354947.html 1. 修改tomcat-cas 配置 1.1 在 D:\test\sso\ ...
- Android Library Project 使用问题总结
1. 当新建Android Library Project 工程或将已有工程转化为Android Library Project, 如果工程源代码中有如下语句: int id = view.getId ...
- VirtualBox-Linux系统安装增强功能
我们在安装之前,必须得先安装好它所需要的依赖包,不然安装过程必定会出现错误! 一.安装依赖包 #yum install kernel-headers #yum install kernel-devel ...
- C#异步下载文件--基于http请求
1.废话不多说,直接上代码: using System; using System.IO; using System.Net; namespace AsyncProgram { class Progr ...
- js获取本机的外网/广域网ip地址
完整源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- 创建和删除节点:——核心DOM
1. 创建单个元素节点:3步: 1. 创建空元素节点对象: var elem=document.createElement("标签名"); ...
- SharePoint 2013 通过审计获取文档下载次数
1.创建一个文档库,进入库设置,找到”Information management policy settings”,点进去,如下图: 2.分别设置”Document”.”Folder”两个,如下图: ...