Tomcat源碼分析之—具體啟動流程分析


    從Tomcat啟動調用棧可知,Bootstrap類的main方法為整個Tomcat的入口,在init初始化Bootstrap類的時候為設置Catalina的工作路徑也就是Catalina_HOME信息、Catalina.base信息,在initClassLoaders方法中初始化類加載器,然后通過反射初始化org.apache.catalina.startup.Catalina作為catalina守護進程;

一、load


Bootstrap中load流程:

  1. 反射調用Catalina的load方法。
  2. 調用Catalina的initDirs()、initNaming()初始化catalinaHome、catalina.useNaming等信息。
  3. 創建Digester對象,調用createStartDigester創建與配置Digester信息,載入Server.xml配置文件,使用Digester解析Server.xml文件,並根據Server文件的配置信息創建Server、Service、Engine、Host、Valve、Realm、Connector、Listener、Resource等對象。
  4. 設置當前Catalina為StandardServer的Catalina對象,調用initStreams。
  5. 調用StandardServer的init方法初始化Server。

    調用Bootstrap的load方法中用反射調用Catalina的load,在Catalina中初始化initDirs()路徑信息,調用createStartDigester創建與配置Digester信息,載入Server.xml配置文件,使用Digester解析Server.xml文件,並根據Server文件的配置信息創建Server、Service、Engine、Host、Valve、Realm、Connector、Listener、Resource等對象,及對象的關聯關系(Digester的相關知識這里就不介紹了)。由於在Digester解析Server.xml的時候已經創建Server對象,所以這里也將server的init方法初始化Server對象,至此Bootstrap執行完成,准確的說是Catalina的load載入完成。

二、start
    接着將調用Bootstrap的start方法啟動容器,在start方法中也是通過反射調用Catalina的start方法,如下圖:

    然后在Catalina中調用StandardServer對象的start方法啟動server,在start方法中就會像我們在Tomcat源碼分析之—組件啟動實現分析那節中分析的一樣,通過Tomcat的生命周期管理觀察者模式實現對Service、Connector、Engine、Host、Context、Wrapper、Pipeline的啟動,這里就不重復在講解了;

三、注冊關閉鈎子(ShutdownHook)

1 if (shutdownHook == null) {
2     shutdownHook = new CatalinaShutdownHook();
3 }
4 Runtime.getRuntime().addShutdownHook(shutdownHook);

四、調用await()與stop(),等候關閉請求與stop容器

    調用Catalina的await實際上就調用StandardServer的await如上圖,等候<Server port="8006" shutdown="SHUTDOWN">在Server 8006端口上的SHUTDOWN關閉Tomcat請求。
接收到SHUTDOWN請求后調用StandardServer的stop方法與destroy方法如下圖:

生命周期管理觀察者模式實現對Service、Connector、Engine、Host、Context、Wrapper、Pipeline的關閉與釋放資源

五、總結
    Tomcat的啟動與關閉流程到此就結束了,整個流程還是比較清晰的,只要清除Tomcat的啟動流程也自然就懂得了Tomcat的關閉流程,Tomcat中使用了觀察者模式對Tomcat的生命周期進行了管理,了解LifecycleBase、Lifecycle、LifecycleSupport等相關類也就了解了整個流程,整個流程的時序圖如下:

                                                           Tomcat啟動與關閉時序圖

 

文章首發地址:Solinx

http://www.solinx.co/archives/121


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM