Tomcat 启动分析-容器初始化

 

Tomcat 启动方式一般都是直接调用bin下的start.*文件直接执行,而start.*文件都会调用catalina.*文件,catalina文件会直接执行bootstrap文件(java):

1、bootstrap的main方法为启动入口,首先会反射调用catalina,初始化类加载器

2、调用catalina的load 方法,该方法会初始化tomcat最主要的几个组件,都是放入createStartDigester中完成的

例如:初始化最外层server组件:

3、初始化完成后,得到server对象,然后调用server的init方法

可以看出server是有实现Lifecycle接口,而主要主键没有直接去实现Lifecycle,而是去继承了Lifecycle的基本实现类LifecycleBase抽象类,该抽象类采用了模板方法模式,实现类需要实现各个lifecycle的钩子方法,例如init(初始化)方法:

初始化前后逻辑LifecycleBase已经处理了,而具体逻辑各个实现类需要去实现initInternal方法。

4、server调用service的init方法

同server一样,service也继承了LifecycleBase

5、service的init方法

初始化excutor和connector,engine,我们先说connector的初始化

6、connector 默认使用又调用protocolHandler的init方法

protocolHandler 默认使用Http11NioProtocol

 

7、Protocol 最终会调用AbstractProtocol的init方法

nioProtocol 使用的endpoint为NioEndpoint

8、NioEndpoint 的初始化工作,最终会调用自身的bind方法

bind方法:

开启serverSocket,默认为100个socket。

9、engine的初始化工作,很奇怪它并没有调用子容器host的初始化工作

经过跟踪发现,子容器host是在engine启动的时候,通过engine的父类ContainerBase的start方法启动

startChild回调启动子容器(host)的start方法

engine因为实现了LifecycleBase,在start之前会判断是否已经初始化,如果没有初始化会先调用初始化工作,然后才会去start钩子方法

10、host如何初始context将在下一章中记录

至此初始化工作已经完成。


 

posted @ 2018-03-29 19:35  lion_eagle  阅读(1191)  评论(1编辑  收藏  举报