web應用關閉後線程不回收問題,web應用線程回收
今天看《spring3.0公司專屬應用程式開發實戰》中關於web應用程式中調度器的啟動和關閉問題中有這樣一段話:
靜態變數是ClassLoader層級的,如果web應用程式停止,這些靜態變數也會從jvm中清除。但是線程則是JVM層級的,如果使用者在web應用中啟動一個線程,這個線程的生命週期並不會和web應用程式保持同步。也就是說,即使停止了web應用,這個線程也依舊是活躍的。
因此為了真正的驗證上面的結論,實戰了一下書中的例子
一 配置tomcat應用管理頁面
1.首先啟動tomcat後,通過web端訪問http://localhost:8080/,出現下面頁面
2.點擊Manager App開啟輸入使用者名稱密碼快顯視窗
3.因不知道使用者名稱密碼,直接取消掉,出現錯誤資訊提示新頁面
4.從上面的新頁面中可以看出來,意思是如果沒有改動設定檔的情況下,直接開啟conf目錄下的tomcat-users.xml檔案,通過添加角色到使用者上面可以訪問對應的許可權頁面
- manager-gui:訪問html頁面,(即URL路徑為/manager/html/*),有訪問status許可權
- manager-script:訪問純文字,(即URL路徑為/manager/text/*),有訪問status許可權
- manager-jmx:訪問JMX代理,(即URL路徑為/manager/jmxproxy/*),有訪問status許可權
- manager-status:查看應用狀態。
5.從tomcat的協助文檔中也可以找到相關資訊,http://localhost:8080/docs/manager-howto.html中,
6.因此直接在tomcat使用者的角色上添加manager-gui就可以訪問頁面了
7.重啟tomcat,使用者名稱tomcat,密碼tomcat登入,就可以查看應用管理相關頁面了。
二 代碼驗證
1.建立web應用程式,並建立TimerListenerTest類,實現ServletContextListener,代碼如下
1 package com.test.timer; 2 3 import java.util.Date; 4 import java.util.Timer; 5 import java.util.TimerTask; 6 7 import javax.servlet.ServletContextEvent; 8 import javax.servlet.ServletContextListener; 9 10 public class TimerListenerTest implements ServletContextListener {11 12 private Timer timer;13 14 @Override15 public void contextDestroyed(ServletContextEvent arg0) {16 System.out.println("---應用關閉---");17 }18 19 @Override20 public void contextInitialized(ServletContextEvent arg0) {21 System.out.println("---應用開啟---");22 23 timer = new Timer();24 25 TimerTaskTest task = new TimerTaskTest();26 27 timer.schedule(task, 1000L, 1000L);28 }29 30 class TimerTaskTest extends TimerTask {31 32 @Override33 public void run() {34 System.out.println("-----" + new Date());35 }36 }37 38 }
2.部署應用,並啟動tomcat,程式運行如下
-----Sat Jan 02 22:42:59 CST 2016-----Sat Jan 02 22:43:00 CST 2016-----Sat Jan 02 22:43:01 CST 2016-----Sat Jan 02 22:43:02 CST 2016
3.通過tomcat web管理頁面直接停止應用,中的WebTest
4.觀察後台運行,出現
5.從上面可以看出,web應用的確運行了contextDestroyed方法來進行相關的銷毀操作,但是觀察應用運行狀態,
應用程式中的線程還是running
6.當然該處程式可以通過timer.cannel()方法來收工回收關閉定時器來關閉線程
7.github代碼地址https://github.com/lixiaojiao2010/WebTest
由此可以驗證文章開始的時候的結論的正確性。