邊城愚人

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            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,在主函數(shù)中,只需如下

          ??? ??? 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();

          }

          }

          }

          ??? ??? 可以通過以下配置實現(xiàn)任務調度:

          <?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使用還是很簡單的,但對于復雜的任務調度,就需要在 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中。  回復  更多評論
            

          主站蜘蛛池模板: 广州市| 肇东市| 绥宁县| 盱眙县| 密山市| 女性| 左贡县| 修水县| 油尖旺区| 呈贡县| 武乡县| 海宁市| 库尔勒市| 胶州市| 丹棱县| 扶绥县| 金阳县| 公安县| 高阳县| 永泰县| 潞城市| 荃湾区| 义马市| 页游| 民权县| 东乡| 郸城县| 广南县| 汤原县| 美姑县| 芮城县| 惠州市| 天津市| 互助| 河北省| 抚远县| 七台河市| 无锡市| 阳江市| 正阳县| 内乡县|