從Tomcat啟動(dòng)調(diào)用棧可知,Bootstrap類的main方法為整個(gè)Tomcat的入口,在init初始化Bootstrap類的時(shí)候?yàn)樵O(shè)置Catalina的工作路徑也就是Catalina_HOME信息、Catalina.base信息,在initClassLoaders方法中初始化類加載器,然后通過反射初始化org.apache.catalina.startup.Catalina作為catalina守護(hù)進(jìn)程;
一、load
Bootstrap中l(wèi)oad流程:
調(diào)用Bootstrap的load方法中用反射調(diào)用Catalina的load,在Catalina中初始化initDirs()路徑信息,調(diào)用createStartDigester創(chuàng)建與配置Digester信息,載入Server.xml配置文件,使用Digester解析Server.xml文件,并根據(jù)Server文件的配置信息創(chuàng)建Server、Service、Engine、Host、Valve、Realm、Connector、Listener、Resource等對(duì)象,及對(duì)象的關(guān)聯(lián)關(guān)系(Digester的相關(guān)知識(shí)這里就不介紹了)。由于在Digester解析Server.xml的時(shí)候已經(jīng)創(chuàng)建Server對(duì)象,所以這里也將server的init方法初始化Server對(duì)象,至此Bootstrap執(zhí)行完成,準(zhǔn)確的說是Catalina的load載入完成。
二、start 接著將調(diào)用Bootstrap的start方法啟動(dòng)容器,在start方法中也是通過反射調(diào)用Catalina的start方法,如下圖:

然后在Catalina中調(diào)用StandardServer對(duì)象的start方法啟動(dòng)server,在start方法中就會(huì)像我們?cè)赥omcat源碼分析之—組件啟動(dòng)實(shí)現(xiàn)分析那節(jié)中分析的一樣,通過Tomcat的生命周期管理觀察者模式實(shí)現(xiàn)對(duì)Service、Connector、Engine、Host、Context、Wrapper、Pipeline的啟動(dòng),這里就不重復(fù)在講解了;
三、注冊(cè)關(guān)閉鉤子(ShutdownHook)
1 if (shutdownHook == null) {2 shutdownHook = new CatalinaShutdownHook();3 }4 Runtime.getRuntime().addShutdownHook(shutdownHook);四、調(diào)用await()與stop(),等候關(guān)閉請(qǐng)求與stop容器
調(diào)用Catalina的await實(shí)際上就調(diào)用StandardServer的await如上圖,等候<Server port="8006" shutdown="SHUTDOWN">在Server 8006端口上的SHUTDOWN關(guān)閉Tomcat請(qǐng)求。接收到SHUTDOWN請(qǐng)求后調(diào)用StandardServer的stop方法與destroy方法如下圖:
生命周期管理觀察者模式實(shí)現(xiàn)對(duì)Service、Connector、Engine、Host、Context、Wrapper、Pipeline的關(guān)閉與釋放資源
五、總結(jié) Tomcat的啟動(dòng)與關(guān)閉流程到此就結(jié)束了,整個(gè)流程還是比較清晰的,只要清除Tomcat的啟動(dòng)流程也自然就懂得了Tomcat的關(guān)閉流程,Tomcat中使用了觀察者模式對(duì)Tomcat的生命周期進(jìn)行了管理,了解LifecycleBase、Lifecycle、LifecycleSupport等相關(guān)類也就了解了整個(gè)流程,整個(gè)流程的時(shí)序圖如下:

Tomcat啟動(dòng)與關(guān)閉時(shí)序圖
文章首發(fā)地址:Solinx
http://www.solinx.co/archives/121
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注