<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    邊城愚人

    如果我不在邊城,我一定是在前往邊城的路上。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      31 隨筆 :: 0 文章 :: 96 評(píng)論 :: 0 Trackbacks

    ??? ??? JDK 內(nèi)建的任務(wù)調(diào)度工具類有 Timer TimerTask 類,對(duì)于簡(jiǎn)單的任務(wù)調(diào)度, JDK Timer 就能夠勝任。一般來說, Timer 應(yīng)該隨程序啟動(dòng)后一直運(yùn)行。如果是 web 程序,可以通過 listener 加載 Timer 實(shí)例。對(duì)于普通的應(yīng)用程序,需要將 Timer 設(shè)置成非后臺(tái)線程才行。

    ??? ??? 來看一個(gè)簡(jiǎn)單的例子:

    ???
    import?java.util.Calendar;

    import?java.util.TimerTask;


    public?class?ATask?extends?TimerTask{


    private?static?final?int?TASK_TIME?=?20;

    private?static?boolean?isRunning?=?false;

    @Override

    public?void?run()?{

    Calendar?c?
    =?Calendar.getInstance();

    if(!isRunning){

    isRunning?
    =?true;

    if(TASK_TIME?==?c.get(Calendar.HOUR_OF_DAY)){

    doSomeTask();

    }

    isRunning?
    =?false;

    }

    }


    public?void?doSomeTask(){

    try?{

    Thread.sleep(
    1000);

    System.out.println(
    "ATask?has?doSomeTask..");

    }?
    catch?(InterruptedException?e)?{

    e.printStackTrace();

    }

    }

    }

    ??? ??? Atask的任務(wù)是在20點(diǎn)的時(shí)候doSomeTask(),其中isRunning是用來避免重復(fù)調(diào)用。

    ??? ??? 我們可以在main中調(diào)用它:

    Timer t = new Timer(false);// false意味不是后臺(tái)線程,這樣主程序不會(huì)終止

    t.schedule(new ATask(), 0, 500);// Timer0延遲,每隔500毫秒的用一次 Ataskrun方法。


    ??? ??? 在spring中,可以通過配置文件設(shè)置Timer的延遲、間隔信息,并利用SpringTimerFactoryBean,建立實(shí)際的調(diào)度。還是上面的 Atask,可以如下配置Spring文件:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>

    <bean id="aTask" class="org.prague.util.ATask">

    </bean>


    <bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">

    <property name="delay" value="0"/>

    <property name="period" value="1000"/>

    <property name="timerTask" ref="aTask"/>

    </bean>


    <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">

    <property name="scheduledTimerTasks">

    <list>

    <ref local="scheduledTask"/>

    </list>

    </property>

    <property name="daemon" value="false"/>

    </bean>

    </beans>


    ??? ??? 由于daemonfalse,在主函數(shù)中,只需如下

    ??? ??? ApplicationContext ac = new ClassPathXmlApplicationContext("timer-spring.xml");就可以調(diào)度任務(wù)了。

    ??? ??? 如果你的Task不想繼承 TimerTask,可以通過SpringMethodInvokingTimerTaskFactoryBean進(jìn)行設(shè)置。例如有個(gè)Task如下:


    public?class?AnotherTask?{

    private?static?final?int?TASK_TIME?=?9;

    private?static?boolean?isRunning?=?false;

    public?void?run()?{

    Calendar?c?
    =?Calendar.getInstance();

    if(!isRunning){

    isRunning?
    =?true;

    if(TASK_TIME?==?c.get(Calendar.HOUR_OF_DAY)){

    doSomeTask();

    }

    isRunning?
    =?false;

    }

    }


    public?void?doSomeTask(){

    try?{

    Thread.sleep(
    2000);

    System.out.println(
    "AnotherTask?has?doSomeTask..");

    }?
    catch?(InterruptedException?e)?{

    e.printStackTrace();

    }

    }

    }

    ??? ??? 可以通過以下配置實(shí)現(xiàn)任務(wù)調(diào)度:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>

    <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">

    <property name="scheduledTimerTasks">

    <list>

    <ref local="anotherScheduledTask"/>

    </list>

    </property>

    <property name="daemon" value="false"/>

    </bean>


    <bean id="anotherTaskTarget" class="org.prague.util.AnotherTask">

    </bean>


    <bean id="anotherTask" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">

    <property name="targetObject" ref="anotherTaskTarget"/>

    <property name="targetMethod" value="run"/>

    </bean>


    <bean id="anotherScheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">

    <property name="delay" value="0"/>

    <property name="period" value="1000"/>

    <property name="timerTask" ref="anotherTask"/>

    </bean>

    </beans>


    ??? ??? 該說的已經(jīng)差不多了。JDKTimer使用還是很簡(jiǎn)單的,但對(duì)于復(fù)雜的任務(wù)調(diào)度,就需要在 TimerTask中進(jìn)行判斷。當(dāng)然,還有其他的選擇,比如Quartz就是很不錯(cuò)的任務(wù)調(diào)度工具,它也能和Spring的搭配得很出色。


    posted on 2007-07-19 09:50 kafka0102 閱讀(2935) 評(píng)論(4)  編輯  收藏 所屬分類: Framework

    評(píng)論

    # re: 在spring中使用Timer[未登錄] 2007-07-19 12:27 jones
    老大,Quartz可不是Spring的“同門師弟“,別誤會(huì)啊!  回復(fù)  更多評(píng)論
      

    # re: 在spring中使用Timer 2007-07-19 14:27 Winefox
    樓主莫要誤人子弟

    補(bǔ)充樓上:


    Quartz是WebWork的同門師弟……  回復(fù)  更多評(píng)論
      

    # re: 在spring中使用Timer 2007-07-19 17:25 小雪飛刀
    不知樓主是否做過測(cè)試,Quartz和JDK TimerTask哪種方式控制起來更快捷、方便?一直再用Quartz,對(duì)JDK TimerTask了解不多,望樓主賜教!  回復(fù)  更多評(píng)論
      

    # re: 在spring中使用Timer 2007-07-20 08:55 kafka0102
    不好意思,記錯(cuò)了,以為Spring也是opnesymphony 的東東了。。我對(duì)Quartz也不是很了解,它在做復(fù)雜的任務(wù)調(diào)度方面要更好些,因?yàn)樗梢栽谂渲梦募信渲谜{(diào)度策略,而Timer則只能寫在TimerTask中。  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲av无码成人精品国产 | 亚洲成_人网站图片| 亚洲麻豆精品果冻传媒| 久久久久亚洲AV成人无码网站| 亚洲无线观看国产精品| 亚洲日韩国产精品乱| 久久亚洲色一区二区三区| 亚洲午夜久久久久久噜噜噜| 亚洲爆乳无码一区二区三区| 久久亚洲国产中v天仙www| 亚洲精品线在线观看| 亚洲毛片无码专区亚洲乱| 亚洲不卡在线观看| 亚洲熟女www一区二区三区| 亚洲AV永久无码天堂影院| 校园亚洲春色另类小说合集| 亚洲a∨国产av综合av下载| 亚洲aⅴ无码专区在线观看 | 免费少妇a级毛片| 亚洲&#228;v永久无码精品天堂久久| 国产精品二区三区免费播放心| 成人免费午间影院在线观看| 日韩中文无码有码免费视频 | 两个人看www免费视频| 无码A级毛片免费视频内谢| 国产91色综合久久免费分享| 歪歪漫画在线观看官网免费阅读 | 久久青草免费91线频观看不卡| 日本亚洲欧洲免费天堂午夜看片女人员| 麻豆成人久久精品二区三区免费| 中文字幕免费在线观看| AA免费观看的1000部电影| 日本一区免费电影| 丝袜熟女国偷自产中文字幕亚洲| 亚洲国产成人久久综合一| 国产亚洲中文日本不卡二区| 黄色免费在线观看网址| 小草在线看片免费人成视久网| 国产一精品一AV一免费孕妇| 亚洲偷自拍拍综合网| 亚洲激情视频网站|