tomcat是現(xiàn)在部署java網(wǎng)絡(luò)工程用的最多的web容器,它幫我們實(shí)現(xiàn)了網(wǎng)絡(luò)請求的監(jiān)聽,各個服務(wù)線程的啟動,幫助我們管理項(xiàng)目中的各個server腳本卿樱。
本文從Bootstrap類中的main函數(shù)開始一步步解析tomcat源碼中的各個流程秃励。我看的是tomcat-8.5.24的版本,如果有什么謬誤的地方也歡迎討論膳凝。
tomcat生命周期管理,pipeline的流動艳汽。四大容器類StandardEngine赠法,StandardHost壶愤,StandardContext及StandardWrapper都有各自缺省的標(biāo)準(zhǔn)valve實(shí)現(xiàn)淑倾,可以參考如下文章http://gearever.iteye.com/blog/1536022
后臺線程的定義是:在程序結(jié)束時,即使線程還在運(yùn)行但不會阻止JVM退出征椒。一個后臺線程的例子就是JVM的垃圾回收線程娇哆。將線程設(shè)置為后臺線程只需要調(diào)用thread.setDaemon(true);參考: http://www.importnew.com/6255.html
bootstrap類,如它的字面意思是一個引導(dǎo)類勃救,引導(dǎo)加載類文件碍讨,啟動tomcat web容器
我們知道java工程,找到main函數(shù)就好像找到了線頭一樣蒙秒,那么tomcat的線頭就在bootstrap類里面main函數(shù)如下
可以看出這個函數(shù)主要做了幾件事情:
bootstrap初始化
將bootstarp設(shè)置入daemon
讀取最后一個入?yún)⒅噶?/p>
? ?????startd:加載參數(shù)勃黍,啟動容器
? ? ? ?stopd:調(diào)用catalina的stop方法的關(guān)閉并銷毀容器
? ? ? ?start:設(shè)置等待狀態(tài)為true(這個后續(xù)會掛起等待后續(xù)命令),加載參數(shù)税肪,啟動容器
? ? ? ? stop:調(diào)用catalina的stopServer方法關(guān)閉容器 該方法會先判斷是否存在一個server實(shí)例溉躲,存在就調(diào)用實(shí)例stop掉,不存在會創(chuàng)建并執(zhí)行解析器益兄,然后再次獲取server向server發(fā)送SHUTDWON的指令(這一塊不是非常理解锻梳,歡迎探討)
bootstrap初始化
主要做了幾件事情
初始化類加載器
設(shè)置catalinaLoader進(jìn)主線程的ContextClassLoader(用于加載webApp下的類)
SecurityManager加載jar包的類
加載啟動類org.apache.catalina.startup.Catalina
通過反射獲取Catalina的接口里的setParentClassLoader,并且執(zhí)行放入sharedLoader
將catalinaDaemon設(shè)為Catalina
其中初始化類加載器主要做了兩件事情:
1净捅、從CatalinaProperties獲取jar包路徑
2疑枯、依據(jù)Catalina目錄jar包路徑,分別依次解析commonLoader蛔六,catalinaLoader荆永,sharedLoader