邊城愚人

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            31 隨筆 :: 0 文章 :: 96 評論 :: 0 Trackbacks
          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(7)

          隨筆分類(32)

          隨筆檔案(31)

          寒冬夜行人

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          ??? ??? 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 閱讀(2938) 評論(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中。  回復  更多評論
            

          主站蜘蛛池模板: 青田县| 弥勒县| 辉县市| 五大连池市| 资阳市| 凤冈县| 来安县| 卢湾区| 东阳市| 鄯善县| 互助| 平果县| 卓资县| 景东| 孟州市| 宽甸| 昌黎县| 广汉市| 同德县| 陇西县| 阿拉尔市| 桂东县| 保康县| 荣成市| 莒南县| 武清区| 宁武县| 浦城县| 福安市| 喀什市| 泌阳县| 武义县| 延安市| 休宁县| 嵩明县| 泊头市| 英山县| 游戏| 东平县| 安多县| 若羌县|