t;/ 目录下所有定义 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/<Engine>/<Host>/<Context>
, 该目录用于存放临时文件。
StardardContext
只是一个容器,而 ApplicationContext
则是一个应用程序真正的运行环境,相关类及操作会在请求处理流程看完以后进行补充。
StardardContext
触发 CONFIGURE_START_EVENT
生命周期事件,ContextConfig
开始调用 configureStart()
对应用程序进行配置。
- 这个过程会解析并合并
conf/web.xml
& conf/<Engine>/<Host>/web.xml.default
& webapps/<Context>/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 会启动失败。
Background process
- 后台进程的作用就是处理一下 Servlet 引擎中的周期性事件,处理周期默认是 10s。
- 特别的
StandardHost
的 backgroundProcess()
方法会触发 Host 的 PERIODIC_EVENT
生命周期事件。然后 HostConfig
会调用其 check()
方法对已加载并进行过重新部署的应用程序进行 reload
或对新部署的应用程序进行热部署。热部署跟之前介绍的部署步骤一致, reload()
过程只是简单的顺序调用 setPause(true)、stop()、start()、setPause(false)
,其中 setPause(true)
的作用是暂时停止接受请求。
How to read excellent open source projects
真正的第一次阅读开源项目源代码,收获还是很大的。让我在架构设计、面向对象思想、设计模式、Clean Code等等各个方面都有了进步。阅读优秀的开源项目其实是一件很爽的事,因为时不时的会发现一个新的设计思路,然后不由自主的感叹一声居然还可以这样!当然了,读的时候还是会有一些痛点的,比如说碰到一个变量,