Tomcat 如何實現一鍵式啟停?

2021-10-10 06:30:45 字數 1920 閱讀 8584

通過前面的學習,相信你對 tomcat 的架構已經有所了解,知道了 tomcat 都有哪些元件,元件之間是什麼樣的關係,以及 tomcat 是怎麼處理乙個 http 請求的。下面我們通過一張簡化的類圖來回顧一下,從圖上你可以看到各種元件的層次關係,圖中的虛線表示乙個請求在 tomcat 中流轉的過程。

上面這張圖描述了元件之間的靜態關係。

在我們實際的工作中,如果你需要設計乙個比較大的系統或者框架時,你同樣也需要考慮這幾個問題:如何統一管理元件的建立、初始化、啟動、停止和銷毀?如何做到**邏輯清晰?如何方便地新增或者刪除元件?如何做到元件啟動和停止不遺漏、不重複?

今天我們就來解決上面的問題,在這之前,先來看看元件之間的關係。如果你仔細分析過這些元件,可以發現它們具有兩層關係。

這兩層關係決定了系統在建立元件時應該遵循一定的順序。

因此,最直觀的做法就是將圖上所有的元件按照先小後大、先內後外的順序建立出來,然後組裝在一起。不知道你注意到沒有,這個思路其實很有問題!因為這樣不僅會造成**邏輯混亂和元件遺漏,而且也不利於後期的功能擴充套件。 

為了解決這個問題,我們希望找到一種通用的、統一的方法來管理元件的生命週期,就像汽車「一鍵啟動」那樣的效果。

我在前面說到過,設計就是要找到系統的變化點和不變點。這裡的不變點就是每個元件都要經歷建立、初始化、啟動這幾個過程,這些狀態以及狀態的轉化是不變的。而變化點是每個具體元件的初始化方法,也就是啟動方法是不一樣的。

因此,我們把不變點抽象出來成為乙個介面,這個介面跟生命週期有關,叫作 lifecycle。lifecycle 介面裡應該定義這麼幾個方法:init、start、stop 和 destroy,每個具體的元件去實現這些方法。

理所當然,在父元件的 init 方法裡需要建立子元件並呼叫子元件的 init 方法。同樣,在父元件的 start 方法裡也需要呼叫子元件的 start 方法,因此呼叫者可以無差別的呼叫各元件的 init 方法和 start 方法,這就是組合模式的使用,並且只要呼叫最頂層元件,也就是 server 元件的 init 和 start 方法,整個 tomcat 就被啟動起來了。下面是 lifecycle 介面的定義。

我們注意到,元件的 init 和 start 呼叫是由它的父元件的狀態變化觸發的,上層元件的初始化會觸發子元件的初始化,上層元件的啟動會觸發子元件的啟動,

因此我們把元件的生命週期定義成乙個個狀態,把狀態的轉變看作是乙個事件。而事件是有***的,在***裡可以實現一些邏輯,並且***也可以方便的新增和刪除,這就是典型的觀察者模式。 

具體來說就是在 lifecycle 介面裡加入兩個方法:新增***和刪除***。除此之外,我們還需要定義乙個 enum 來表示元件有哪些狀態,以及處在什麼狀態會觸發什麼樣的事件。因此 lifecycle 介面和 lifecyclestate 就定義成了下面這樣。

從圖上你可以看到,元件的生命週期有 new、initializing、initialized、starting_prep、starting、started 等,而一旦元件到達相應的狀態就觸發相應的事件,比如 new 狀態表示元件剛剛被例項化;而當 init 方法被呼叫時,狀態就變成 initializing 狀態,這個時候,就會觸發 before_init_event 事件,如果有***在監聽這個事件,它的方法就會被呼叫。

tomcat一鍵發布

linux下tomcat一鍵發布,包含停用服務 刪除war包 拷貝war包及備份 重啟服務等,以前的版本還包含svn更新及打包,後來在生產上怕出問題,改成本地打war包後,ftp上傳到指定目錄的方式。2.1 真實 檔名稱做了隱藏更改處理,修改檔案路徑後可使用。bin sh 1instance apa...

Linux 一鍵部署tomcat

apt get update apt get install tomcat8 apt get install tomcat8 docs tomcat8 admin tomcat8 examples apt get install default jdk apt get install ant git...

Android如何實現一鍵置頂

在很多新聞類專案中,我們向下滑動列表檢視新聞,一般都會實現下拉重新整理,上拉載入更多的功能,有時我們滑到了很底部,這時需要重新整理或上拉到頂部就很麻煩,所以需要一鍵置頂,很多專案中都有這種設計,那麼該怎麼實現呢?下面提供一種實現思路,不是很麻煩,直接上 public class gotopscrol...