一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Web應(yīng)用程序中調(diào)度器的啟動和關(guān)閉問題

 醉三郎 2012-06-03
我們知道靜態(tài)變量是ClassLoader級別的,如果Web應(yīng)用程序停止,這些靜態(tài)變量也會從JVM中清除。但是線程則是JVM級別的,如果你在Web 應(yīng)用中啟動一個線程,這個線程的生命周期并不會和Web應(yīng)用程序保持同步。也就是說,即使你停止了Web應(yīng)用,這個線程依舊是活躍的。正是因?yàn)檫@個很隱晦 的問題,所以很多有經(jīng)驗(yàn)的開發(fā)者不太贊成在Web應(yīng)用中私自啟動線程。

如果我們手工使用JDK Timer(Quartz的Scheduler),在Web容器啟動時啟動Timer,當(dāng)Web容器關(guān)閉時,除非你手工關(guān)閉這個Timer,否則Timer中的任務(wù)還會繼續(xù)運(yùn)行!

下面通過一個小例子來演示這個“詭異”的現(xiàn)象,我們通過ServletContextListener在Web容器啟動時創(chuàng)建一個Timer并周期性地運(yùn)行一個任務(wù):
Java代碼 復(fù)制代碼 收藏代碼
  1. //代碼清單StartCycleRunTask:容器監(jiān)聽器   
  2. package com.baobaotao.web;   
  3. import java.util.Date;   
  4. import java.util.Timer;   
  5. import java.util.TimerTask;   
  6. import javax.servlet.ServletContextEvent;   
  7. import javax.servlet.ServletContextListener;   
  8. public class StartCycleRunTask implements ServletContextListener ...{   
  9.     private Timer timer;   
  10.     public void contextDestroyed(ServletContextEvent arg0) ...{   
  11.         // ②該方法在Web容器關(guān)閉時執(zhí)行   
  12.         System.out.println("Web應(yīng)用程序啟動關(guān)閉...");   
  13.     }   
  14.     public void contextInitialized(ServletContextEvent arg0) ...{   
  15.          //②在Web容器啟動時自動執(zhí)行該方法   
  16.         System.out.println("Web應(yīng)用程序啟動...");   
  17.         timer = new Timer();//②-1:創(chuàng)建一個Timer,Timer內(nèi)部自動創(chuàng)建一個背景線程   
  18.         TimerTask task = new SimpleTimerTask();   
  19.         timer.schedule(task, 1000L, 5000L); //②-2:注冊一個5秒鐘運(yùn)行一次的任務(wù)   
  20.     }   
  21. }   
  22. class SimpleTimerTask extends TimerTask ...{//③任務(wù)   
  23.     private int count;   
  24.     public void run() ...{   
  25.         System.out.println((++count)+"execute task..."+(new Date()));   
  26.     }   
  27. }  

在web.xml中聲明這個Web容器監(jiān)聽器:<?xml version="1.0" encoding="UTF-8"?>
<web-app>

    <listener>
        <listener-class>com.baobaotao.web.StartCycleRunTask</listener-class>
    </listener>
</web-app>

在Tomcat中部署這個Web應(yīng)用并啟動后,你將看到任務(wù)每隔5秒鐘執(zhí)行一次。
運(yùn)行一段時間后,登錄Tomcat管理后臺,將對應(yīng)的Web應(yīng)用(chapter13)關(guān)閉。

轉(zhuǎn)到Tomcat控制臺,你將看到雖然Web應(yīng)用已經(jīng)關(guān)閉,但Timer任務(wù)還在我行我素地執(zhí)行如故——舞臺已經(jīng)拆除,戲子繼續(xù)表演:

我們可以通過改變清單StartCycleRunTask的代碼,在contextDestroyed(ServletContextEvent arg0)中添加timer.cancel()代碼,在Web容器關(guān)閉后手工停止Timer來結(jié)束任務(wù)。

Spring為JDK Timer和Quartz Scheduler所提供的TimerFactoryBean和SchedulerFactoryBean能夠和Spring容器的生命周期關(guān)聯(lián),在 Spring容器啟動時啟動調(diào)度器,而在Spring容器關(guān)閉時,停止調(diào)度器。所以在Spring中通過這兩個FactoryBean配置調(diào)度器,再從 Spring IoC中獲取調(diào)度器引用進(jìn)行任務(wù)調(diào)度將不會出現(xiàn)這種Web容器關(guān)閉而任務(wù)依然運(yùn)行的問題。而如果你在程序中直接使用Timer或Scheduler,如不 進(jìn)行額外的處理,將會出現(xiàn)這一問題。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    又色又爽又黄的三级视频| 日本人妻免费一区二区三区| 亚洲国产精品肉丝袜久久| 欧美精品一区二区水蜜桃| 国产美女精品人人做人人爽| 欧美日韩有码一二三区| 亚洲国产av在线观看一区| 国产乱人伦精品一区二区三区四区| 欧美激情中文字幕综合八区| 国产日韩欧美一区二区| 久久精品国产熟女精品| 国产丝袜美女诱惑一区二区| 国产精品乱子伦一区二区三区| 国产不卡一区二区四区| 日韩精品视频香蕉视频| 欧美特色特黄一级大黄片| 日本精品中文字幕在线视频| 在线免费不卡亚洲国产| 在线观看视频日韩精品| 成人亚洲国产精品一区不卡| 亚洲精品av少妇在线观看| 国产视频福利一区二区| 免费在线播放一区二区| 欧洲日本亚洲一区二区| 国产人妻精品区一区二区三区 | 经典欧美熟女激情综合网| 丝袜人妻夜夜爽一区二区三区| 欧美一区二区三区视频区| 日本免费一区二区三女| 久热青青草视频在线观看| 中文字幕免费观看亚洲视频| 亚洲欧美日韩网友自拍| 日韩成人动作片在线观看| 国产精品福利一二三区| 亚洲一区二区精品免费| 久久老熟女一区二区三区福利| 国产又色又爽又黄又大| 精品日韩av一区二区三区| 午夜精品久久久99热连载| 欧美性欧美一区二区三区| 久久三级国外久久久三级|