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執行。