如何檢測(cè)Tomcat的狀態(tài)是UP還是DOWN?
做為工程師,有些時(shí)候,總會(huì)遇到部署的 Web 應(yīng)用沒有響應(yīng),或者狀態(tài)不對(duì)等各類問題。 對(duì)于部署在 Tomcat 之上的 Java Web 應(yīng)用,一般我們都會(huì)像程咬金一樣,先使出「三板斧」來分析問題。
- 請(qǐng)求一下
- 查下進(jìn)程在不在
- jstack 打下線程棧分析
我們?cè)诓榭催M(jìn)程是否存在時(shí),并沒有直接查看對(duì)應(yīng) Web 應(yīng)用的方式, 一般都是查看 Tomcat 的對(duì)應(yīng) Java 進(jìn)程是否在。 如果應(yīng)用沒有響應(yīng)另外再觀察線程棧。
那這里有一個(gè)問題,Tomcat 進(jìn)程在的時(shí)候,我們?cè)趺磥砜?Tomcat的狀態(tài)呢?
畢竟做為一個(gè)Java 應(yīng)用,只要一啟動(dòng)的時(shí)候就會(huì)創(chuàng)建進(jìn)程。這個(gè)并不能做為 Tomcat 在工作的真實(shí)依據(jù)。 此時(shí)有什么辦法來判斷當(dāng)前 Tomcat 的工作狀態(tài)呢?
一般在做集群內(nèi)容器的心跳狀態(tài)檢測(cè)時(shí)也會(huì)遇到同樣的問題。
這種情況如果 Tomcat 部署了ROOT應(yīng)用,可以通過訪問其指定的頁面來判斷請(qǐng)求是否可達(dá),來確認(rèn) Tomcat 的狀態(tài)。
另外一種方式是通過連接 Tomcat 的 MBeanServer 來確認(rèn)其狀態(tài)。一般情況Tomcat 宕掉了 MBeanServer也會(huì)連接失敗。
前面的文章我們介紹過 JMX 連接到 Tomcat 提供的 MBeanServer 上(你了解JMX在Tomcat的應(yīng)用嗎?),可以執(zhí)行一系列的容器相關(guān)組件的操作,甚至像啟動(dòng)停止 Connector 這些看似「危險(xiǎn)」的操作。
當(dāng)然要通過 JMX URL 連接到 Tomcat MBeanServer 上,是需要在啟動(dòng)腳本中配置參數(shù)啟用。 除此之外,也可以用類似 JConsole 連接到各個(gè) JVM 進(jìn)程的方式,是通過 attach 到 VirtualMachine 后獲取連接的。這個(gè)方式我們后面再寫文章單獨(dú)說。
在在官方的FQA里,還提到了一種實(shí)現(xiàn)檢測(cè)狀態(tài)的方式。
熟悉 Tomcat 配置的朋友都知道, 在一臺(tái)機(jī)器上部署多個(gè) Tomcat 時(shí),經(jīng)常會(huì)有端口沖突的問題, 這是因?yàn)樵?server.xml 里會(huì)配置多個(gè)端口供實(shí)例使用。 除了 Connector 監(jiān)聽的端口外,還有一個(gè) Server 組件使用的端口,默認(rèn)是8005。 多個(gè)實(shí)例之間,除 Connector 端口外,這個(gè)SHUTDOWN 端口也是沖突的。
這里要實(shí)現(xiàn)檢測(cè) Tomcat 狀態(tài)就是通過連接這個(gè)「端口」來實(shí)現(xiàn)。
說到端口,大家***印象一定是 Socket ,這里正是連接到這個(gè)端口對(duì)應(yīng)的ServerSocket上,如果可以正常連接,表示 Tomcat 處于運(yùn)行狀態(tài)。 連接不上Socket 自然是 Tomcat 不可用了。
該端口除了獲取狀態(tài)外,還可以干啥呢? 還可以停止 Tomcat 進(jìn)程,畢竟該端口可是號(hào)稱SHUTDOWN端口啊。
實(shí)現(xiàn)起來也比較簡(jiǎn)單,在 Tomcat 的 SHUTDOWN端口旁邊,還有一個(gè)屬性,做為一個(gè)token,用于識(shí)別來關(guān)閉 Tomcat 的命令。當(dāng) Server 接收到帶有這個(gè)token 的命令時(shí),退出實(shí)例。
完整的實(shí)現(xiàn),需要根據(jù)指定的 Tomcat 安裝目錄,解析配置文件,獲取 SHUTDOWN 端口,以及對(duì)應(yīng)的token,連接對(duì)應(yīng)的 ServerSocket,獲取狀態(tài),執(zhí)行命令。
【本文為51CTO專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過作者微信公眾號(hào)『Tomcat那些事兒』獲取授權(quán)】