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

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

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

    邊城愚人

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      31 隨筆 :: 0 文章 :: 96 評論 :: 0 Trackbacks

    ??? ??? JDK 內建的任務調度工具類有 Timer TimerTask 類,對于簡單的任務調度, JDK Timer 就能夠勝任。一般來說, Timer 應該隨程序啟動后一直運行。如果是 web 程序,可以通過 listener 加載 Timer 實例。對于普通的應用程序,需要將 Timer 設置成非后臺線程才行。

    ??? ??? 來看一個簡單的例子:

    ???
    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的任務是在20點的時候doSomeTask(),其中isRunning是用來避免重復調用。

    ??? ??? 我們可以在main中調用它:

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

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


    ??? ??? 在spring中,可以通過配置文件設置Timer的延遲、間隔信息,并利用SpringTimerFactoryBean,建立實際的調度。還是上面的 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,在主函數中,只需如下

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

    ??? ??? 如果你的Task不想繼承 TimerTask,可以通過SpringMethodInvokingTimerTaskFactoryBean進行設置。例如有個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();

    }

    }

    }

    ??? ??? 可以通過以下配置實現任務調度:

    <?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>


    ??? ??? 該說的已經差不多了。JDKTimer使用還是很簡單的,但對于復雜的任務調度,就需要在 TimerTask中進行判斷。當然,還有其他的選擇,比如Quartz就是很不錯的任務調度工具,它也能和Spring的搭配得很出色。


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

    評論

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

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

    補充樓上:


    Quartz是WebWork的同門師弟……  回復  更多評論
      

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

    # re: 在spring中使用Timer 2007-07-20 08:55 kafka0102
    不好意思,記錯了,以為Spring也是opnesymphony 的東東了。。我對Quartz也不是很了解,它在做復雜的任務調度方面要更好些,因為它可以在配置文件中配置調度策略,而Timer則只能寫在TimerTask中。  回復  更多評論
      

    主站蜘蛛池模板: 今天免费中文字幕视频| 一本色道久久88—综合亚洲精品 | 天天摸夜夜摸成人免费视频| 久久精品国产亚洲av四虎| 成人无码精品1区2区3区免费看| 精品国产亚洲男女在线线电影| 黄网站色视频免费看无下截| 在线观看免费国产视频| 国产亚洲视频在线播放大全| 免费一级特黄特色大片在线| 特级一级毛片免费看| 中文字幕亚洲专区| 免费网站观看WWW在线观看| 亚洲AV无码精品色午夜果冻不卡| 四虎影视在线影院在线观看免费视频 | 亚洲精品第一国产综合亚AV| 日韩毛片无码永久免费看| 国产亚洲综合久久| 亚洲男同帅GAY片在线观看| 久久免费国产精品一区二区| 亚洲视频免费在线观看| 在线观看成人免费视频不卡| 亚洲香蕉在线观看| 亚洲M码 欧洲S码SSS222| 色www永久免费| 亚洲日本国产精华液| 好爽…又高潮了免费毛片| 无码免费又爽又高潮喷水的视频| 国产亚洲成AV人片在线观黄桃| 91麻豆国产免费观看| 亚洲国产AV无码一区二区三区| 亚洲视频在线精品| 91成人在线免费观看| 亚洲a∨国产av综合av下载| 久久久久国产成人精品亚洲午夜 | 又大又硬又爽免费视频| 99久久精品毛片免费播放| 亚洲性色成人av天堂| 亚洲精品成人在线| 7x7x7x免费在线观看| 国产精品自拍亚洲|