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