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