對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方法執行能夠結束這兩個進程,問題解決。