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

          spring 任務調度總結

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

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

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

          spring 任務調度總結
          參考資料
          http://www.ibm.com/developerworks/cn/java/j-quartz/
          http://www.opensymphony.com/quartz/download.action

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


          spring+timer

          1 .使用java Timer調度任務
          第一步 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調度任務*********************
               使用java Timer調度第一步是從java.util.TimerTask派生一個任務
               聲明本身只是將EmailReportTask放到應用上下文,
              并在testBean屬性裝配TestBean
              在調度之前不會做任何事。
              -->
              <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定義了一個定時器任務的運行周期。應該如下裝配一個ScheduledTimerTask
              timerTask告訴ScheduledTimerTask運行哪個TimerTask,
              這里該裝配屬性指向reportTimerTask的一個引用。
              屬性period告訴ScheduledTimerTask以怎樣的頻率調用TimerTask的run()方法。
              這個屬性以毫秒作為單位,
              86400000指定該任務每24小時運行一次
              10X1000
               屬性scheduledTimerTasks  要求一個需要啟動的定時器任務列表。
               ScheduledTimerTask有一個delay屬性, 允許你指定當任務第一次運行之前應該等多久。
               如,EmailReportTask的第一次運行延遲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負責啟動定時任務。按以下方式在Spring配置文件里聲明它-->
              <bean class="org.springframework.scheduling.timer.TimerFactoryBean">
                  <property name="scheduledTimerTasks">
                      <list>
                          <ref bean="scheduledReportTask"/>
                      </list>
                  </property>
              </bean>
          </beans>  
          第三步 相關類的編寫
           EmailReportTask.java
           public class EmailReportTask extends TimerTask {//必需繼承TimerTask
               Log log= LogFactory.getLog(EmailReportTask.class);
               public EmailReportTask() {
               }

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

               private TestBean testBean;//這里實現spring的依賴注入

               public void setTestBean(TestBean testBean) {
                   this.testBean = testBean;
               }
           }
           testBean.java
           public class TestBean {
               public String greeting="hello,world";
           }
           
           
          spring+Quartz
          Quartz 作業(yè)調度框架所提供的 API 在兩方面都表現極佳:既全面強大,又易于使用。Quartz 可以用于簡單的作業(yè)觸發(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>
           <!--用它來指定一個工作應以怎樣的頻率運行,及第一次運行工作前應等多久-->
           <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允許更精確的控制任務的運行時間。如果要在每天的6:00運行任務可以按照以下方式聲明一個CronTriggerBean
          0 0 6 * * ?
          jobDetail屬性告訴觸發(fā)器調度哪一個工作,屬性cronExpression告訴觸發(fā)器何時觸發(fā)。一個cron表達式至少有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)或一個通配符(*)月份中的日期和星期中的日期這兩個元素時互斥的一起應該通過設置一個問號(?)來表明不想設置那個字段
          對于cronReportTrigger我們設置的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>  
          第三步 相關類的編寫  
           EmailReportTask2.java
           public class EmailReportTask2 extends QuartzJobBean {
               Log log = LogFactory.getLog(EmailReportTask.class);

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

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


               private TestBean testBean;//這里實現spring的依賴注入

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


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


          JavaEye推薦




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


          網站導航:
           
          主站蜘蛛池模板: 庄河市| 潞城市| 尼勒克县| 宁陕县| 南和县| 镇雄县| 确山县| 五台县| 永新县| 晴隆县| 额敏县| 乌拉特中旗| 盐池县| 二连浩特市| 建德市| 阿拉善左旗| 万安县| 井陉县| 邢台市| 大厂| 海原县| 巴青县| 宜城市| 宝兴县| 长兴县| 正宁县| 黔江区| 杭州市| 科尔| 新乡县| 贡山| 惠安县| 梧州市| 河津市| 神农架林区| 迁西县| 遂昌县| 龙江县| 德庆县| 汉沽区| 高邑县|