posts - 23, comments - 0, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          spring 任務(wù)調(diào)度總結(jié)

          Posted on 2008-08-18 17:04 beauty9235 閱讀(4231) 評論(0)  編輯  收藏

          作者: beauty9235  鏈接:http://beauty9235.javaeye.com/blog/229617  發(fā)表時間: 2008年08月08日

          聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

          spring 任務(wù)調(diào)度總結(jié)
          參考資料
          http://www.ibm.com/developerworks/cn/java/j-quartz/
          http://www.opensymphony.com/quartz/download.action

          Java的Timer類和OpenSymphony的Quartz調(diào)度器是兩個流行的調(diào)度API。Spring為這兩個調(diào)度器提供了一個抽象層,可以更容易的使用他們


          spring+timer

          1 .使用java Timer調(diào)度任務(wù)
          第一步 web.xml
           <!--*********************** spring setting ***********************-->
              <listener>
                  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
              </listener>
              <context-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>
                      /WEB-INF/classes/applicationContextTimeTask.xml
                  </param-value>
              </context-param>
          第二步  配置applicationContextTimeTask.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<beans>
               <!--
               ****************使用java Timer調(diào)度任務(wù)*********************
               使用java Timer調(diào)度第一步是從java.util.TimerTask派生一個任務(wù)
               聲明本身只是將EmailReportTask放到應(yīng)用上下文,
              并在testBean屬性裝配TestBean
              在調(diào)度之前不會做任何事。
              -->
              <bean id="testBean" class="com.photo.test.TestBean"/>
              <bean id="reportTimerTask" class="com.photo.task.EmailReportTask">
                  <property name="testBean">
                      <ref bean="testBean"/>
                  </property>
              </bean>
              <!--
              Spring的ScheduledTimerTimerTask定義了一個定時器任務(wù)的運(yùn)行周期。應(yīng)該如下裝配一個ScheduledTimerTask
              timerTask告訴ScheduledTimerTask運(yùn)行哪個TimerTask,
              這里該裝配屬性指向reportTimerTask的一個引用。
              屬性period告訴ScheduledTimerTask以怎樣的頻率調(diào)用TimerTask的run()方法。
              這個屬性以毫秒作為單位,
              86400000指定該任務(wù)每24小時運(yùn)行一次
              10X1000
               屬性scheduledTimerTasks  要求一個需要啟動的定時器任務(wù)列表。
               ScheduledTimerTask有一個delay屬性, 允許你指定當(dāng)任務(wù)第一次運(yùn)行之前應(yīng)該等多久。
               如,EmailReportTask的第一次運(yùn)行延遲5毫秒
              -->


              <bean id="scheduledReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
                  <property name="timerTask">
                      <ref bean="reportTimerTask"/>
                  </property>
                  <property name="period">
                      <value>10000</value>
                  </property>
                  <property name="delay">
                      <value>5000</value>
                  </property>
              </bean>
              <!--Spring 的TimerFactoryBean負(fù)責(zé)啟動定時任務(wù)。按以下方式在Spring配置文件里聲明它-->
              <bean class="org.springframework.scheduling.timer.TimerFactoryBean">
                  <property name="scheduledTimerTasks">
                      <list>
                          <ref bean="scheduledReportTask"/>
                      </list>
                  </property>
              </bean>
          </beans>  
          第三步 相關(guān)類的編寫
           EmailReportTask.java
           public class EmailReportTask extends TimerTask {//必需繼承TimerTask
               Log log= LogFactory.getLog(EmailReportTask.class);
               public EmailReportTask() {
               }

               public void run() {//這個函數(shù)是調(diào)度任務(wù)執(zhí)行的入口
                  log.debug("task begin :"+testBean.greeting);
               }

               private TestBean testBean;//這里實現(xiàn)spring的依賴注入

               public void setTestBean(TestBean testBean) {
                   this.testBean = testBean;
               }
           }
           testBean.java
           public class TestBean {
               public String greeting="hello,world";
           }
           
           
          spring+Quartz
          Quartz 作業(yè)調(diào)度框架所提供的 API 在兩方面都表現(xiàn)極佳:既全面強(qiáng)大,又易于使用。Quartz 可以用于簡單的作業(yè)觸發(fā),也可以用于復(fù)雜的 JDBC 持久的作業(yè)存儲和執(zhí)行。
          第一步  同上
          第二步  配置applicationContextTimeTask.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
          <beans>
          <bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean">
            <property name="jobClass">
             <value>com.photo.task.EmailReportTask2</value>
            </property>
            <property name="jobDataAsMap">
             <map>
              <entry key="testBean">
               <ref bean="testBean"/>
              </entry>
             </map>
            </property>
           </bean>
           <!--用它來指定一個工作應(yīng)以怎樣的頻率運(yùn)行,及第一次運(yùn)行工作前應(yīng)等多久-->
           <bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
            <property name="jobDetail">
             <ref bean="reportJob"/>
            </property>
            <property name="startDelay">
             <value>3600000</value>
            </property>
            <property name="repeatInterval">
             <value>86400000</value>
            </property>
           </bean>
          <!--
          CronTriggerBean允許更精確的控制任務(wù)的運(yùn)行時間。如果要在每天的6:00運(yùn)行任務(wù)可以按照以下方式聲明一個CronTriggerBean
          0 0 6 * * ?
          jobDetail屬性告訴觸發(fā)器調(diào)度哪一個工作,屬性cronExpression告訴觸發(fā)器何時觸發(fā)。一個cron表達(dá)式至少有6個由空格分隔的時間元素(最多7個)從左到右元素定義如下
             1。秒(0-59)
             2。分(0-59)
             3。小時(0-23)
             4。月份中的日期(1-31)
             5。月份(1-12 或 JAN-DEC)
             6。星期(1-7 或 SUN-SAT)
             7。年份(1970-2099)
            每一個元素都可以顯示規(guī)定的一個值,一個區(qū)間(9-14),一個列表(9,12,14)或一個通配符(*)月份中的日期和星期中的日期這兩個元素時互斥的一起應(yīng)該通過設(shè)置一個問號(?)來表明不想設(shè)置那個字段
          對于cronReportTrigger我們設(shè)置的cronExpression為 0 0 6 * * ?可以讀作任意月份任何日期的6時0分0秒執(zhí)行觸發(fā)器
          -->
           <bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
            <property name="jobDetail">
             <ref bean="reportJob"/>
            </property>
            <property name="cronExpression">
             <value>0/5 * * * * ?</value>
            </property>
           </bean>
           <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
             <list>
              <ref bean="cronReportTrigger"/>
             </list>
            </property>
           </bean>
          </beans>  
          第三步 相關(guān)類的編寫  
           EmailReportTask2.java
           public class EmailReportTask2 extends QuartzJobBean {
               Log log = LogFactory.getLog(EmailReportTask.class);

               public EmailReportTask2() {
               }
           //這個函數(shù)是調(diào)度任務(wù)執(zhí)行的入口
               protected void executeInternal(JobExecutionContext jobExecutionContext) throws org.quartz.JobExecutionException {

                   log.debug("task 2 begin :" + testBean.greeting);
               }


               private TestBean testBean;//這里實現(xiàn)spring的依賴注入

               public void setTestBean(TestBean testBean) {
                   this.testBean = testBean;
               }
           }
           TestBean.java 同上


          本文的討論也很精彩,瀏覽討論>>


          JavaEye推薦




          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 浏阳市| 鹿邑县| 灌阳县| 措勤县| 长沙县| 扶余县| 嘉禾县| 乐昌市| 资讯 | 孝感市| 广昌县| 杭锦旗| 永丰县| 南漳县| 武隆县| 曲靖市| 康乐县| 芦山县| 秀山| 平谷区| 和顺县| 木兰县| 大荔县| 渝中区| 昌乐县| 鄂托克前旗| 韩城市| 襄城县| 葫芦岛市| 五台县| 鄂州市| 塘沽区| 南丰县| 青海省| 辽中县| 洪江市| 嵩明县| 囊谦县| 达尔| 镇巴县| 麟游县|