1. 启动流程时序图解读及容器生命周期管理机制
tomcat启动流程
startup.bat -> catalina.bat 中 找到启动的主类为 org.apache.catalina.startup.Bootstrap
2. ini初始化在加载一此类加载器
父容器调用子容器的 init /start 方法
容器/组件 都有 init / start 方法, 初始化 后 启动,都是相同的 处理方式 -> 逐级初始化
为什么这些 容器/组件 都有 init start之类的方法呢?
容器/组件 都是有生命周期的, tomcat抽象了顶层 生命周期接口 org.apache.catalina.Lifecycle , 容器/组件 都实现该接口,实现生命周期的统一管理
再看Protocohandler 类的继承关系,可以发现 ProtocolHandler(EndPoint + Processor的组合类)的实现类,就是 实现了 从 用户输入 到转换成 Tomcat原生 Servlet 转换时,各个协议(http1.1/1.2 Ajp等)的实现类
2. Tomcat启动流程 源码追踪
org.apache.catalina.startup.Bootstrap#main -> org.apache.catalina.startup.Bootstrap#init()
- daemon 就是当前 Bootstrap 本身, catalinaDaemon就是一个Catalina的实例
- 接着就是 初始化加载 和 启动 两个方法
-
Tomcat初始化流程 org.apache.catalina.startup.Bootstrap#load 方法
org.apache.catalina.startup.Bootstrap#load -> org.apache.catalina.startup.Catalina#load()
- load()的主要方法
org.apache.catalina.startup.Catalina#createStartDigester xml 配置文件的解析器,解析server.xml
- Server 的初始化
- 初始化类之间的关系
- service初始化方法 同样的模板方法 org.apache.catalina.c ore.StandardService#initInternal
engine初始化化 engine.init() -> host.init() -> Context.init
共享线程池的初始化executor.init()
连接器 Connector的初始化 connector.init()
- 连接池初始化 org.apache.catalina.connector.Connector#initInternal
// adapter 将Tomcat原生的Request转换为ServletRequest
adapter = new CoyoteAdapter(this);
// 赋值给 protocolHandler, protocolHandler设置完Endpoint,processor后,要使用adapter
protocolHandler.setAdapter(adapter);
- ProtocolHandler的初始化 , 由某一具体协议类实现 org.apache.coyote.http11.AbstractHttp11Protocol#init
org.apache.coyote.AbstractProtocol#init
- EndPoint的初始化 org.apache.tomcat.util.net.AbstractEndpoint#init
org.apache.tomcat.util.net.NioEndpoint#bind
NIO相关的进行端口号的绑定
至此,初始化方法 org.apache.catalina.startup.Bootstrap#load 执行完毕
-
start 启动方法 与 初始化方法Load类似,重点关注 ProtocolHandler的启动方法
类图如下:
org.apache.coyote.AbstractProtocol#start
startInternal()是模板方法,由子类 org.apache.tomcat.util.net.NioEndpoint#startInternal 实现
startAcceptorThreads 启动线程来接收 socket请求 org.apache.tomcat.util.net.AbstractEndpoint#startAcceptorThreads
org.apache.tomcat.util.net.NioEndpoint#createAcceptor 创建线程对象
org.apache.tomcat.util.net.NioEndpoint.Acceptor 线程类,来 接收socket的请求
至此,Tomcat启动方法 org.apache.catalina.startup.Bootstrap#start 完成