<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)論
      

    主站蜘蛛池模板: 成人亚洲国产va天堂| 亚洲日本VA午夜在线电影| 中文字幕亚洲精品无码| 免费很黄无遮挡的视频毛片| 久久免费美女视频| 大陆一级毛片免费视频观看| a级亚洲片精品久久久久久久| 亚洲国产理论片在线播放| 免费大片av手机看片| 18观看免费永久视频| 亚洲第一视频在线观看免费| 亚洲资源在线视频| 男女污污污超污视频免费在线看| 91视频免费网址| 亚洲精品线路一在线观看| 亚洲人色大成年网站在线观看| 国产精品黄页免费高清在线观看| 国国内清清草原免费视频99| 亚洲最大AV网站在线观看| 亚洲AV无码无限在线观看不卡| 成人自慰女黄网站免费大全| 午夜神器成在线人成在线人免费| 亚洲AV日韩AV永久无码免下载| 日韩精品亚洲专区在线影视| 在线观看免费av网站| 亚洲午夜精品久久久久久浪潮 | 亚洲成AV人片在线观看无码| 亚洲欧美日韩一区二区三区在线| 久久永久免费人妻精品| 免费亚洲视频在线观看| 亚洲一级大黄大色毛片| 国产成人免费AV在线播放| 免费人成在线观看视频播放| 亚洲乱人伦精品图片| 日韩视频在线观看免费| www亚洲一级视频com| 亚洲人成电影网站免费| 亚洲成人免费在线观看| 久久亚洲精品视频| 四虎影视永久在线精品免费| 大学生一级特黄的免费大片视频|