邊城愚人

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

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

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

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

          ???
          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點的時候doSomeTask(),其中isRunning是用來避免重復(fù)調(diào)用。

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

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

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


          ??? ??? 在spring中,可以通過配置文件設(shè)置Timer的延遲、間隔信息,并利用SpringTimerFactoryBean,建立實際的調(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è)置。例如有個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();

          }

          }

          }

          ??? ??? 可以通過以下配置實現(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使用還是很簡單的,但對于復(fù)雜的任務(wù)調(diào)度,就需要在 TimerTask中進(jìn)行判斷。當(dāng)然,還有其他的選擇,比如Quartz就是很不錯的任務(wù)調(diào)度工具,它也能和Spring的搭配得很出色。


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

          評論

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

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

          補充樓上:


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

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

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

          主站蜘蛛池模板: 双鸭山市| 紫阳县| 淮北市| 东乌珠穆沁旗| 玉屏| 通渭县| 永胜县| 枣庄市| 荃湾区| 嵊州市| 隆昌县| 繁峙县| 红安县| 中江县| 屏山县| 习水县| 嘉黎县| 郎溪县| 江油市| 绵阳市| 竹山县| 平昌县| 濮阳县| 安达市| 彰化县| 庄浪县| 荥阳市| 潼南县| 恩平市| 冀州市| 曲靖市| 新安县| 华池县| 仁化县| 沙田区| 上思县| 吐鲁番市| 红安县| 祁连县| 如皋市| 江陵县|