tomcat如何實現(xiàn)一鍵啟停

一萄凤、tomcat組件關(guān)系和請求流轉(zhuǎn)

? 先上一張圖谎碍,看之前可以先參考“tomcat整體架構(gòu)”一文


tomcat流轉(zhuǎn).png
  • 動態(tài)生命周期管理

    • 讓一個系統(tǒng)能夠?qū)ν馓峁┓?wù)鲤脏,我們需要創(chuàng)建爽茴、組裝并啟動這些組件灾锯;
    • 服務(wù)停止的時候兢榨,我們還需要 釋放資源,銷毀這些組件
  • 組件關(guān)系的兩個維度思考

    • 大小關(guān)系顺饮,大組件管理小組件如Server管理service吵聪,service管理connector和container等等
    • 內(nèi)外關(guān)系,外層組件控制內(nèi)層組件兼雄,如連接器負(fù)責(zé)對外又調(diào)用內(nèi)層容器組件完成業(yè)務(wù)處理
  • 系統(tǒng)創(chuàng)建組件順序

    • 先創(chuàng)建子組件再創(chuàng)建父組件吟逝,子組件需要注入到父組件內(nèi)部
    • 先創(chuàng)建內(nèi)層組件再創(chuàng)建外層組件,內(nèi)層組件要注入到外層組件內(nèi)部

二赦肋、tomcat生命周期管理

  • 一鍵式啟停: Lifecycle 接口

    • 不變點抽象块攒,組件的生命周期無非就是init、start佃乘、stop囱井、destory這些過程,這些過程都是一樣的統(tǒng)一放到一個接口里也就是Lifecycle接口里
    • 變化點是具體的init和start過程趣避,每個組件可以單獨實現(xiàn)
    • 父組件的init方法需要先調(diào)用子組件的init讓子組件先初始化庞呕,父組件的start方法需要先調(diào)用子組件的start方法讓子組件先啟動,這是典型的組合模式
    • 整個的啟動過程就是先調(diào)用server的init和start方法整個tomcat就可以啟動起來了


      生命周期接口.png

      可擴(kuò)展性:Lifecycle 事件

  • 每個組件的具體init或start過程可能都是多變的程帕,可能會不斷增加邏輯住练,直接修改原來的方法違反開閉原則開閉原則說的是為了擴(kuò)展系統(tǒng)的功能,你不能直接修改系統(tǒng)中已有的類愁拭,但是你可以定義新的類

  • 組件的啟動過程是有狀態(tài)的讲逛,可以將生命周期定義成一個個的狀態(tài),狀態(tài)的變化可以看成一個事件岭埠,而在事件上是可以加監(jiān)聽器妆绞。監(jiān)聽器可以自由擴(kuò)展和配置,這就是典型的觀察者模式tomcat就是這樣干的

  • 組件的生命周期有 NEW枫攀、INITIALIZING、INITIALIZED株茶、STARTING_PREP来涨、STARTING、STARTED 等启盛,具體怎么配置監(jiān)聽器可以自己研讀源碼蹦掐,或者以后單獨再說


    組件狀態(tài)轉(zhuǎn)換與生命周期.png
  • 重用性:LifecycleBase 抽象基類

  • 有了接口就需要子類去實現(xiàn)技羔,一般來說可能會有多個實現(xiàn)類,此時必然有一些通用的邏輯卧抗,如果都分開實現(xiàn)會有代碼重復(fù)藤滥,可以先定義一個抽象基類,來實現(xiàn)接口的通用邏輯社裆。各個子類子類集成抽象基類并實現(xiàn)它拙绊。其實這就是模板方法模式

  • tomcat定義了一個抽象基類LifecycleBase 來實現(xiàn) Lifecycle 接口把一些公共的邏輯放到基類中去,比如生命狀態(tài)的轉(zhuǎn)變與維護(hù)泳秀、生命事件的觸發(fā)以及監(jiān)聽器的添加和刪除等标沪。

  • 子類就負(fù)責(zé)實現(xiàn)自己的初始化、啟動和停止等方法

  • 為了避免跟基類中的方法同名嗜傅,我們把具體子類的實現(xiàn)方法改個名字金句,在后面加上 Internal,叫 initInternal吕嘀、startInternal 等


    lifebase基類.png

    監(jiān)聽器如何注冊

  • Tomcat 自定義了一些監(jiān)聽器违寞,這些監(jiān)聽器是父組件在創(chuàng)建子組件的過程中注冊到子組件的。比如 MemoryLeakTrackingListener 監(jiān)聽器偶房,用來檢測 Context 容器中的內(nèi)存泄漏趁曼,這個監(jiān)聽器是 Host 容器在創(chuàng)建 Context 容器時注冊到 Context 中的。

  • 還可以在server.xml中定義自己的監(jiān)聽器蝴悉,Tomcat 在啟動時會解析server.xml彰阴,創(chuàng)建監(jiān)聽器并注冊到容器組件

  • 總體類圖


    生命周期整體類圖.png
  • StandardServer、StandardService 等是 Server 和 Service 組件的具體實現(xiàn)類拍冠,它們都繼承了 LifecycleBase

  • StandardEngine尿这、StandardHost、StandardContext 和 StandardWrapper 是相應(yīng)容器組件的具體實現(xiàn)類庆杜,因為它們都是容器射众,所以繼承了 ContainerBase 抽象基類,而 ContainerBase 實現(xiàn)了 Container 接口晃财,也繼承了 LifecycleBase 類叨橱,它們的生命周期管理接口和功能接口是分開的,這也符合設(shè)計中接口分離的原則

三断盛、精華總結(jié)

Tomcat 為了實現(xiàn)一鍵式啟停以及優(yōu)雅的生命周期管理罗洗,并考慮到了可擴(kuò)展性和可重用性,將面向?qū)ο笏枷牒驮O(shè)計模式發(fā)揮到了極致钢猛,分別運用了組合模式伙菜、觀察者模式、骨架抽象類和模板方法命迈。

  • 如果你需要維護(hù)一堆具有父子關(guān)系的實體贩绕,可以考慮使用組合模式

  • 當(dāng)一個事件發(fā)生后火的,需要執(zhí)行一連串更新操作,這時候就可以考慮用觀察者模式

  • 模板方法在抽象基類中經(jīng)常用到淑倾,將通用方法抽象到父類馏鹤,子類實現(xiàn)自己獨特業(yè)務(wù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娇哆,隨后出現(xiàn)的幾起案子湃累,更是在濱河造成了極大的恐慌,老刑警劉巖迂尝,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脱茉,死亡現(xiàn)場離奇詭異,居然都是意外死亡垄开,警方通過查閱死者的電腦和手機琴许,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溉躲,“玉大人榜田,你說我怎么就攤上這事《褪幔” “怎么了箭券?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疑枯。 經(jīng)常有香客問我辩块,道長,這世上最難降的妖魔是什么荆永? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任废亭,我火速辦了婚禮,結(jié)果婚禮上具钥,老公的妹妹穿的比我還像新娘豆村。我一直安慰自己,他們只是感情好骂删,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布掌动。 她就那樣靜靜地躺著,像睡著了一般宁玫。 火紅的嫁衣襯著肌膚如雪粗恢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天欧瘪,我揣著相機與錄音适滓,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛凭迹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苦囱,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嗅绸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撕彤?” 一聲冷哼從身側(cè)響起鱼鸠,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羹铅,沒想到半個月后蚀狰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡职员,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年麻蹋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焊切。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扮授,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出专肪,到底是詐尸還是另有隱情刹勃,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布嚎尤,位于F島的核電站荔仁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芽死。R本人自食惡果不足惜乏梁,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望收奔。 院中可真熱鬧掌呜,春花似錦、人聲如沸坪哄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翩肌。三九已至模暗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間念祭,已是汗流浹背兑宇。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粱坤,地道東北人隶糕。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓瓷产,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枚驻。 傳聞我的和親對象是個殘疾皇子濒旦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354