01. Tomcat 启动流程解析
2022-03-20 13:55:47 0 举报
AI智能生成
Tomcat 启动流程解析
作者其他创作
大纲/内容
Bootstrap.main()
启动入口
启动入口
new Bootstrap().init()
初始化 Bootstrap
初始化 Bootstrap
initClassLoaders()
初始化 Tomcat 的三个类加载器
初始化 Tomcat 的三个类加载器
通过反射构造 Catalina 对象
并赋值给【catalinaDaemon】对象
并赋值给【catalinaDaemon】对象
把刚刚初始化的 BootStrap 赋值给【daemon】
解析传入参数 command 命令
默认是 start,即没传入就是启动命令
默认是 start,即没传入就是启动命令
daemon.load(args)
加载启动参数
加载启动参数
通过反射执行【catalinaDaemon】的 load() 方法
parseServerXml(true)
解析【server.xml】配置文件
解析【server.xml】配置文件
getServer().init()
这里是【StandardServer】组件
这里是【StandardServer】组件
globalNamingResources.init()
初始化 JNDI 组件
初始化 JNDI 组件
service.init()
获取所有的 services,挨个初始化
这里是【StandardService】组件
获取所有的 services,挨个初始化
这里是【StandardService】组件
engine.init()
引擎初始化
这里是【StandardEngine】组件
引擎初始化
这里是【StandardEngine】组件
executor.init()
判断是否配置了线程池,就执行初始化
这里默认是没有
判断是否配置了线程池,就执行初始化
这里默认是没有
mapperListener.init()
初始化 mapper 监听器
初始化 mapper 监听器
connector.init()
获取所有的连接器,挨个初始化
获取所有的连接器,挨个初始化
protocolHandler.init()
协议处理器初始化
这里是【Http11NioProtocol】组件
协议处理器初始化
这里是【Http11NioProtocol】组件
endpoint.init()
端口初始化
这里是【NioEndpoint】组件
端口初始化
这里是【NioEndpoint】组件
bindWithCleanup()
初始化并绑定端口号
初始化并绑定端口号
NioEndpoint.bind()
具体实例组件的绑定方法
具体实例组件的绑定方法
initServerSocket()
初始化 ServerSocketChannel
初始化 ServerSocketChannel
initialiseSsl()
初始化 ssl
初始化 ssl
daemon.start()
启动服务
启动服务
通过反射执行【catalinaDaemon】的 start() 方法
getServer().start()
调用 start() 方法启动
这里是【StandardServer】组件
调用 start() 方法启动
这里是【StandardServer】组件
globalNamingResources.start()
启动 JNDI 组件
启动 JNDI 组件
service.init()
获取所有的 services,挨个启动
这里是【StandardService】组件
获取所有的 services,挨个启动
这里是【StandardService】组件
engine.start()
引擎启动
这里是【StandardEngine】组件
引擎启动
这里是【StandardEngine】组件
super.startInternal()
调用父类【ContainerBase】方法
调用父类【ContainerBase】方法
findChildren()
查找容器中的所有虚拟主机【StandardHost】
查找容器中的所有虚拟主机【StandardHost】
child.start()
用线程池并发启动 Host,每一个 Host 被封装成 Callable
这里是【StandardHost】组件
用线程池并发启动 Host,每一个 Host 被封装成 Callable
这里是【StandardHost】组件
给 pipeline 组装所有的 Valve
pipeline.start()
等上面所有的 Host 启动好才会启动管道
这里是【StandardPipeline】组件
等上面所有的 Host 启动好才会启动管道
这里是【StandardPipeline】组件
StandardPipeline.init()
此时为新建状态,先执行 init() 完成初始化
此时为新建状态,先执行 init() 完成初始化
Valve.start()
获取容器中的所有 Valve 阀门,挨个启动
获取容器中的所有 Valve 阀门,挨个启动
Valve.init()
此时为新建状态,先执行 init() 完成初始化
此时为新建状态,先执行 init() 完成初始化
Valve.initInternal()
执行具体阀门的启动方法
执行具体阀门的启动方法
setState(LifecycleState.STARTING)
发布 STARTING 事件通知
发布 STARTING 事件通知
HostConfig.lifecycleEvent()
【HostConfig】监听事件
【HostConfig】监听事件
deployApps()
异步并发部署服务
异步并发部署服务
executor.start()
判断是否配置了线程池,就执行启动方法
这里默认是没有
判断是否配置了线程池,就执行启动方法
这里默认是没有
mapperListener.start()
启动 mapper 监听器
启动 mapper 监听器
connector.start()
获取所有的连接器,挨个启动
获取所有的连接器,挨个启动
protocolHandler.start()
协议处理器启动
这里是【Http11NioProtocol】组件
协议处理器启动
这里是【Http11NioProtocol】组件
endpoint.start()
端口启动
这里是【NioEndpoint】组件
端口启动
这里是【NioEndpoint】组件
判断当前是否有 work 线程池,没有就创建一个
它是负责真正干活的线程池
它是负责真正干活的线程池
initializeConnectionLatch()
初始化连接计数限制器
底层用的是 AQS,类似于 CountDownLatch
初始化连接计数限制器
底层用的是 AQS,类似于 CountDownLatch
pollerThread.start()
启动一个 poller 拉取线程
启动一个 poller 拉取线程
监听状态变更事件
startAcceptorThread()
初始化一个接收者线程
初始化一个接收者线程
它的作用是从 endpoint 中监听 socket 连接
接收来自 8080 端口号的数据
接收来自 8080 端口号的数据
await()
服务器 hang 住
服务器 hang 住
serverSocket.accept()
它是接收自 8005 端口的数据
作用是用来发接收服务器指令,如【SHUTDOWN】
它是接收自 8005 端口的数据
作用是用来发接收服务器指令,如【SHUTDOWN】
0 条评论
下一页