| Tomcat Start[Deployment]   
    图中从 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/// 目录下的应用程序。 
    解析 $CATALINA_BASE/conf/// 目录下所有定义 Context 的 XML 文件,并添加到  StandardHost。这些 XML 文件称为应用程序描述符。正因为如此,我们可以配置一个虚拟路径来保存应用程序中用到的图片,详细的配置过程请参考  开发环境配置指南 – 6.3. 配置图片存放目录部署 $CATALINA_BASE/webapps 下所有的 WAR 文件,并添加到 StandardHost。部署 $CATALINA_BASE/webapps 下所有已解压的目录,并添加到 StandardHost。 
    特别的,添加到 StandardHost 时,会直接调用 StandardContext 的 start() 方法来启动应用程序。启动应用程序步骤请看  Context Start 一节。在 StandardEngine 和 StandardContext 启动时都会调用各自的 threadStart()  方法,该方法会创建一个新的后台线程来处理该该容器和子容器及容器内各组件的后台事件。StandardEngine  会直接创建一个后台线程,StandardContext 默认是不创建的,和 StandardEngine 共用同一个。后台线程处理机制是周期调用组件的  backgroundProcess() 方法。详情请看 Background process 一节。MapperListener 
    addListeners(engine) 方法会将该监听器添加到 StandardEngine 和它的所有子容器中registerHost() 会注册所有的 Host 和他们的子容器到 Mapper 中,方便后期请求处理时使用。当有新的应用(StandardContext)添加进来后,会触发 Host 的容器事件,然后通过 MapperListener 将新应用的映射注册到  Mapper 中。 
    Start 工作都做完以后 Catalina 会创建一个 CatalinaShutdownHook 并注册到  JVM。CatalinaShutdownHook 继承了 Thread,是 Catalina 的内部类。其 run 方法中直接调用了 Catalina 的  stop() 方法来关闭整个服务器。注册该 Thread 到 JVM 的原因是防止用户非正常终止  Tomcat,比如直接关闭命令窗口之类的。当直接关闭命令窗口时,操作系统会向 JVM 发送一个终止信号,然后 JVM 在退出前会逐一启动已注册的  ShutdownHook 来关闭相应资源。 Context Start   
    StandRoot 类实现了 WebResourceRoot 接口,它容纳了一个应用程序的所有资源,通俗的来说就是部署到 webapps 目录下对应  Context 的目录里的所有资源。因为我对 Tomcat 的资源管理部分暂时不是很感兴趣,所以资源管理相关类只是做了简单了解,并没有深入研究源代码。resourceStart() 方法会对 StandardRoot 进行初始配置postWorkDirectory() 用于创建对应的工作目录  $CATALINA_BASE/work///, 该目录用于存放临时文件。StardardContext 只是一个容器,而 ApplicationContext  则是一个应用程序真正的运行环境,相关类及操作会在请求处理流程看完以后进行补充。StardardContext 触发 CONFIGURE_START_EVENT 生命周期事件,ContextConfig 开始调用  configureStart() 对应用程序进行配置。 
    这个过程会解析并合并 conf/web.xml & conf///web.xml.default &  webapps//WEB-INF/web.xml 中的配置。配置配置文件中的参数到 StandardContext, 其中主要的包括 Servlet、Filter、Listener。因为从 Servlet3.0 以后是直接支持注解的,所以服务器必须能够处理加了注解的类。Tomcat 通过分析 WEB-INF/classes/ 中的  Class 文件和 WEB-INF/lib/ 下的 jar 包将扫描到的 Servlet、Filter、Listerner 注册到  StandardContext。setConfigured(true),是非常关键的一个操作,它标识了 Context 的成功配置,若未设置该值为 true 的话,Context  会启动失败。 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |