2016-07-15 60 views
2

我有一個運行在tomcat上的web應用程序,並將其狀態報告給另一個監視應用程序(此監視應用程序監視系統中的其他幾個進程)。如果端口已被佔用,則終止tomcat

如果應用程序在tomcat中成功部署,則監視應用程序會顯示該應用程序正在運行。

但是,如果tomcat無法偵聽在serer.xml中的Connector元素中配置的端口,應用程序仍會部署,因此它在監視應用程序中顯示爲活動狀態。但是,由於Web服務器未在配置的端口上偵聽,因此用戶無法實際訪問Web應用程序。

有沒有一種方法可以配置tomcat,以便它會終止(或至少不部署webapps),如果它無法偵聽服務器端口?

+0

爲什麼在部署應用程序後,監視程序嘗試在相關端口上發送請求?在部署的應用程序上放置類似'''alive.html''的東西? –

+0

爲什麼不使用HTTP探測來檢測應用程序的「活躍性」,而不是將應用程序置於監控系統的家中? –

+1

@ShmulikKlein你的方法很好,但監控應用程序不在我的控制之下。它由一個獨立的團隊開發,它有自己的API來與它溝通。這是它第一次監視一個Web應用程序。 –

回答

1

我發現這個gist這可能會幫助你實現結合到Tomcat的init事件,並檢查其組件的狀態邏輯(根據要點的意見,你可能已經找到了Maven構件裏面做一樣)。

創建一個生命週期偵聽器,如ConnectorListener,並使其實現LifeCycleListener接口。然後將代碼從要點放入經過優化的lifeCycleEvent方法(您應該進行一些調整以使其適合)。

然後將其添加到您的web.xml<engine>標籤。

+0

我不明白在要點中給出的代碼應該放在哪裏。你能解釋一下嗎? –

+0

我已經提出了更詳細的答案。 –

+0

我沒有找到在應用程序本身中添加生命週期偵聽器的方法。根據文檔(https://tomcat.apache.org/tomcat-8.0-doc/config/context.html#Lifecycle_Listeners)生命週期偵聽器應該添加到context.xml中,並放置在$ CATALINA_HOME/lib中目錄。我找不到任何地方提及''標籤。 –

0

你可以在{tomcat_setup}/bin/startup.sh文件中寫一些腳本。

添加下面的腳本行後包含EXECUTABLE=catalina.sh

parent=`dirname "$PRGDIR"` 
file="$parent"/conf/server.xml 
host=`hostname` 
#get ports from server.xml 
for i in `grep -o "<Connector port=\".*\"" "$file" | cut -d\" -f2`; 
do 
    #check port is listening 
    ret=`cat </dev/null> /dev/tcp/"$host"/"$i"` 
    if [ $? -eq 0 ]; then 
     echo "Tomcat is already working!" 
     exit 1 
    fi 
done 
相關問題