Tomcat執行shutdown方法后無法徹底關閉問題


對tomcat進行了一些改寫,使得tomcat能夠響應新的協議請求。

在改寫完畢以后,在eclipse上debug沒有任何問題,便將改寫后的tomcat打成jar包,替換原本的apache-tomcat-6.0.37目錄下lib文件夾內的對應jar包。

執行startup.sh后一切正常,程序和debug的結果一致。

但是執行了一次shutdown后再執行一次startup發現無法獲取Mapper對象。

ps -ef發現java進程有好多沒有關閉,因此考慮是線程的生命周期沒有控制好導致tomcat運行結束后線程依舊沒有關閉。

進入JAVA_HOME目錄下bin文件夾,找到命令jstack,jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息。

命令格式:

jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

 

使用jstack打印信息后,發現有兩個沒有結束的進程,以及由於這些進程導致的其他無法關閉的進程,因此在shutdown命令執行后,無法完全關閉tomcat,導致第二次啟動時會出現bug

 

定位到這兩個進程,發現都是在run()方法中使用了while(true)使得程序無法正確終止,最后在新寫入的Protocol類中實現的destroy方法內,將這兩個線程的while判斷條件做了限制,使得destroy方法執行能夠結束這兩個進程,問題解決。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM