加入收藏 | 设为首页 | 会员中心 | 我要投稿 三明站长网 (https://www.0598zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

深入Tomcat 架构及启动过程「含部署」

发布时间:2019-05-28 12:08:31 所属栏目:外闻 来源:今日头条
导读:副标题#e# 这个题目命的其实是很大的,写的时候还是很忐忑的,但我尽可能把这个过程描述清楚。因为这是读过源码以后写的总结,在写的过程中可能会忽略一些前提条件,如果有哪些比较突兀就出现,或不好理解的地方可以给我提 Issue,我会尽快补充修订相关内容

Tomcat Start[Deployment]

深入Tomcat 架构及启动过程「含部署」
  • 图中从 StandardHost Start StandardContext 的这步其实在真正的执行流程中会直接跳过,因为 conf/server.xml 文件中并没有配置任何的 Context,所以在 findChildren() 查找子容器时会返回空数组,所以之后遍历子容器来启动子容器的 for 循环就直接跳过了。
  • 触发 Host 的 BEFORE_START_EVENT 生命周期事件,HostConfig 调用其 beforeStart() 方法创建 $CATALINA_BASE/webapps& $CATALINA_BASE/conf/// 目录。
  • 触发 Host 的 START_EVENT 生命周期事件,HostConfig 调用其 start() 方法开始部署已在 $CATALINA_BASE/webapps & $CATALINA_BASE/conf/// 目录下的应用程序。
  1. 解析 $CATALINA_BASE/conf/// 目录下所有定义 Context 的 XML 文件,并添加到 StandardHost。这些 XML 文件称为应用程序描述符。正因为如此,我们可以配置一个虚拟路径来保存应用程序中用到的图片,详细的配置过程请参考 开发环境配置指南 – 6.3. 配置图片存放目录
  2. 部署 $CATALINA_BASE/webapps 下所有的 WAR 文件,并添加到 StandardHost。
  3. 部署 $CATALINA_BASE/webapps 下所有已解压的目录,并添加到 StandardHost。
  • 特别的,添加到 StandardHost 时,会直接调用 StandardContext 的 start() 方法来启动应用程序。启动应用程序步骤请看 Context Start 一节。
  • 在 StandardEngine 和 StandardContext 启动时都会调用各自的 threadStart() 方法,该方法会创建一个新的后台线程来处理该该容器和子容器及容器内各组件的后台事件。StandardEngine 会直接创建一个后台线程,StandardContext 默认是不创建的,和 StandardEngine 共用同一个。后台线程处理机制是周期调用组件的 backgroundProcess() 方法。详情请看 Background process 一节。
  • MapperListener
  1. addListeners(engine) 方法会将该监听器添加到 StandardEngine 和它的所有子容器中
  2. registerHost() 会注册所有的 Host 和他们的子容器到 Mapper 中,方便后期请求处理时使用。
  3. 当有新的应用(StandardContext)添加进来后,会触发 Host 的容器事件,然后通过 MapperListener 将新应用的映射注册到 Mapper 中。
  • Start 工作都做完以后 Catalina 会创建一个 CatalinaShutdownHook 并注册到 JVM。CatalinaShutdownHook 继承了 Thread,是 Catalina 的内部类。其 run 方法中直接调用了 Catalina 的 stop() 方法来关闭整个服务器。注册该 Thread 到 JVM 的原因是防止用户非正常终止 Tomcat,比如直接关闭命令窗口之类的。当直接关闭命令窗口时,操作系统会向 JVM 发送一个终止信号,然后 JVM 在退出前会逐一启动已注册的 ShutdownHook 来关闭相应资源。

Context Start

深入Tomcat 架构及启动过程「含部署」
  • StandRoot 类实现了 WebResourceRoot 接口,它容纳了一个应用程序的所有资源,通俗的来说就是部署到 webapps 目录下对应 Context 的目录里的所有资源。因为我对 Tomcat 的资源管理部分暂时不是很感兴趣,所以资源管理相关类只是做了简单了解,并没有深入研究源代码。
  • resourceStart() 方法会对 StandardRoot 进行初始配置
  • postWorkDirectory() 用于创建对应的工作目录 $CATALINA_BASE/work///, 该目录用于存放临时文件。
  • StardardContext 只是一个容器,而 ApplicationContext 则是一个应用程序真正的运行环境,相关类及操作会在请求处理流程看完以后进行补充。
  • StardardContext 触发 CONFIGURE_START_EVENT 生命周期事件,ContextConfig 开始调用 configureStart() 对应用程序进行配置。
  1. 这个过程会解析并合并 conf/web.xml & conf///web.xml.default & webapps//WEB-INF/web.xml 中的配置。
  2. 配置配置文件中的参数到 StandardContext, 其中主要的包括 Servlet、Filter、Listener。
  3. 因为从 Servlet3.0 以后是直接支持注解的,所以服务器必须能够处理加了注解的类。Tomcat 通过分析 WEB-INF/classes/ 中的 Class 文件和 WEB-INF/lib/ 下的 jar 包将扫描到的 Servlet、Filter、Listerner 注册到 StandardContext。
  4. setConfigured(true),是非常关键的一个操作,它标识了 Context 的成功配置,若未设置该值为 true 的话,Context 会启动失败。

(编辑:三明站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读