天天看點

Spring 定時任務功能

Spring 定時任務功能 

[風]

                 《Spring 定時任務功能》

       在很久很久以前,做過一些Spring 的項目。Spring的定時功能很不錯的東西,但不容易碰上使用它的項目。現再次總結成文,以飨讀者。

       原理性的東西就不說了,入門的書個人覺得還是《Spring in action》比較好。

開始:

       其實實作方式不止一種,這裡讨論的是我認為比較好的一種。

1:需要的jar包:

       Spring的包自然不必說了;

       quartz.jar;

       jta.jar;

       commons-collections.jar;

       這裡Spring用到了Quartz, 它是一個開源的作業排程架構,它完全由Java寫成,并設計用于J2SE和J2EE應用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執行一個作業而建立簡單的或複雜的排程。

2:建立任務類(就是一個普通的JAVA BEAN):例如:

public class TestTimerTask {

    public void execute(){

        System.out.println("開始背景使用者資料預處理......");

    }

}

通常定時任務都是背景處理業務,這個類裡的方法就是我們想讓它定時執行的;

3:spring裡的配置如下示例代碼:

     <bean id="TimerTask"

         class="com.spr.spring.bean.TestTimerTask"/><!—這裡就是上面定義的BEAN-->

     <bean id="scheduledInfo"

         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

         <property name="targetObject">

              <ref bean="TimerTask"/>

         </property>

         <property name="targetMethod"><!—這裡定義要調用的方法-->

              <value>execute</value>

         </property>

     </bean>

     <bean id="cronInfoTrigger"

         class="org.springframework.scheduling.quartz.CronTriggerBean">

         <property name="jobDetail">

              <ref bean="scheduledInfo"/>

         </property>

         <property name="cronExpression">

              <value>0 * * * *  </value>    

              <!—以上的說明見附錄 這裡是每分鐘的0秒時執行操作-->

         </property>

     </bean>

     <bean autowire="no"

         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

         <property name="triggers">

              <list>

                   <ref bean="cronInfoTrigger"/>

              </list>

         </property>

     </bean>

需要說明的是最後一個BEAN是管理這些觸發器的總設定,他管理我們的觸發器清單。一定要把autowire設定為no。“cronInfoTrigger”這是一個觸發器的bean的設定,裡面的cronExpression就是定義什麼時候執行觸發的,文法比較不好了解。

4:一般的SPRING項目都要在web.xml裡設定如下内容:

       <context-param>

         <param-name>contextConfigLocation</param-name>

         <param-value>/WEB-INF/classes/applicationContext.xml</param-value>

     </context-param>

     <!-- servlet>

         <servlet-name>context</servlet-name>

         <servlet-class>

              org.springframework.web.context.ContextLoaderServlet

         </servlet-class>

         <load-on-startup>1</load-on-startup>

     </servlet-->

     <listener>

         <listener-class>

              org.springframework.web.context.ContextLoaderListener

     </listener-class>

     </listener>

上面被注釋的内容是另一種加載Spring的方式,如果你用的環境Servlet版本過低的話就用它吧!

這樣基本就差不多了,你可以在任務BEAN裡加連資料庫的操作等,很爽吧…

内容不是很通俗,需要你對SPRING 有一定的了解,大家努力吧! 

                                                風

                                     2007年12月18日12:00

附錄:

一個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)

每一個元素都可以顯式地規定一個值(如6),一個區間(如9-12),一個清單(如9,11,13)或一個通配符(如*)。“月份中的日期”和“星期中的日期”這兩個元素是互斥的,是以應該通過設定一個問号(?)來表明你不想設定的那個字段。表7.1中顯示了一些cron表達式的例子和它們的意義:

表7.1                                            一些cron表達式的例子

表  達  式

 意    義

0 0 10,14,16 * *  

 每天上午10點,下午2點和下午4點

0 0,15,30,45 * 1-10 *  

 每月前10天每隔15分鐘

30 0 0 1 1   2012

 在2012年1月1日午夜過30秒時

0 0 8-5   * MON-FRI

 每個工作日的工作時間

對于cronReportTrigger,我們設定cronExpression為0 0 6 * *  可以把它讀作“在任何月份任何日期(不管是星期幾)的6時0分0秒執行觸發器。”換句話說,這個觸發器會在每天早晨6:00執行。

繼續閱讀