Java自帶的java. util.Timer類,這個類別允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程式依照某一個頻度執行,但不能在指定時間運作。
使用Quartz,這是一個功能比較強大的的調度器,可以讓你的程式在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯複雜。
Spring3.0以後自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。
作業類別需要繼承自特定的作業類基底類,如Quartz需要繼承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要繼承自java.util.TimerTask。
作業類別即普通的java類,不需要繼承自任何基底類別。
註:個人建議使用第二種方式,因為這樣所以的類別都是普通類,不需要事先區別對待。
每隔指定時間則觸發一次,在Quartz中對應的觸發器為:org.springframework.scheduling.quartz.SimpleTriggerBean
#每到指定時間則觸發一次,在Quartz中對應的調度器為:org.springframework.scheduling.quartz.CronTriggerBean
第一步:定義作業類別
#import org.quartz.JobExecutionContext;
##import org.quartz.JobExecutionException; ##import org.quartz.JobExecutionException; ##import org.quartz.JobExecutionException;
但是
#import org.springframework.scheduling.quartz.QuartzJobBean;#public
public class Job1 ##JobbJobBeanfQuartzpublic
class Job1 #Job#JobBeanf {#private #int timeout;
#private
0;
bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean">
property #name= "jobClass" value="com.gy.Job1" />
property name="jobDataAsMap">
#map>
entry key="timeout" value="0" />
##map#>
property>
##bean>
#Quartz的作業觸發器有兩種,分別是org .springframework.scheduling.quartz.SimpleTriggerBeanorg.springframework.scheduling.quartz.CronTriggerBean第一種SimpleTriggerBean,只支援依照一定頻率呼叫任務,如每隔30分鐘執行一次。 設定方式如下:
bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
##property name="jobDetail" #ref= "job1" />
#property
name=/>
bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
property #name= "jobDetail" ref="job1" />
>
property # name="cronExpression" value="0 0 12 * * ?" /> 1
#bean>
關於cronExpression表達式的語法請參考附錄。
第四步:設定調度工廠
#bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
property name="triggers">
#list>
#ref bean="cronTrigger" />
list>
>
#
bean
# 說明:此參數指定的是先前設定的觸發器的名字。 第五步:啟動你的應用程式即可,即將工程部署至tomcat或其他容器。
第二種,作業類別不繼承特定基底類別。
##這兩個類別分別對應spring支援的兩種實作任務調度的方式,即前文提到到java自帶的timer task方式和Quartz方式。這裡我只寫MethodInvokingJobDetailFactoryBean的用法,使用該類的好處是,我們的任務類不再需要繼承自任何類,而是普通的pojo。
Java程式碼
bean id="job2"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
# #property name="targetObject">
##bean
/> #property>
#property
name=
"concurrent"value=
"false"/>
##bean>
# 說明:這一步是關鍵步驟,聲明一個MethodInvokingJobDetailFactoryBean,有兩個關鍵屬性:targetObject指定任務類,targetMethod指定執行的方法。往下的步驟就與方法一相同了,為了完整,同樣貼出。 第三個步驟:設定作業排程的觸發方式(觸發器)#Quartz的作業觸發器有兩種,分別是org .springframework.scheduling.quartz.SimpleTriggerBeanorg.springframework.scheduling.quartz.CronTriggerBean第一種SimpleTriggerBean,只支援依照一定頻率呼叫任務,如每隔30分鐘執行一次。 設定方式如下:
bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
#property
name=/>
bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
property #name= "jobDetail" ref="job2" />
##> property # name="cronExpression" value="0 0 12 * * ?" />
1
#
#Xml程式碼 #bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
>property name="triggers"
>
#list> #ref
/>
#list
>property
>
#
bean
import org.springframework.stereotype.Service;
@Service
#public class TaskJob {
public void job1() {
System.out.println(“任務進行中。。。”);
}
}
第二步驟:在spring設定檔頭中新增命名空間及描述
beans #xmlns= "http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
# 。 。 。 。 。 。
xsi:schemaLocation="http://www.springframework.org/schema/task "#>
第三步驟:在spring設定檔中設定特定的任務
## task:scheduled-tasks>
@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.ANNOTATION_TYPE})
##@Retention(RetentionPolicy.RUNTIME)
#@Documented
{
public
abstract String cron()#abstract String cron() ;
#
public
## public abstract
long fixedRate();}
cron:指定cron表達式fixedDelay:官方文件解釋:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示從上一個任務完成開始到下一個任務開始的間隔,單位是毫秒。
fixedRate:官方文件解釋:An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.即從上一個任務開始到下一個任務開始的間隔,單位是毫秒。下面我來設定一下。 第一步:寫pojo
Java程式碼
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
##xml version="1.0" encoding="UTF-8"?>
##beans xmlns= “ http://www.springframework.org/schema/beans”
xmlns:xsi= " http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
#xmlns:context="http://www.springframework.org/schema/context"
# #xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
## " “假”>
context:annotation-config />; > ##
#context:component-scan"com.gy.mytask" #/> ; ##>
說明:理論上只需要加上
Ok配置完畢,當然spring task還有很多參數,我就不一一解釋了,具體參考xsd文件。
附錄:
cronExpression的設定說明,具體使用以及參數請百度google
欄位 允許值允許的特殊字元
秒 0-59 , - * /
分 0-59 , - * /
小時 0-23 , - * /
日期 1-31 , - * ? / L W C##o1 -12 或JAN-DEC , - * /
#星期 1-7 或SUN-SAT , - * ? / L C
#。 (可選) 留空, 1970-2099 , - * /
- 區間
#* 萬用字元
* 通配符
#? 你不想設定那個欄位
下面隻例出幾個式子
CRON表達式 意義
"0 0 12 * * ?" 每天中午十二點觸發
"0 15 10 ? * *" 每天早上10:15觸發
"0 15 10 * * ?" 每天早上10:15觸發
"0 15 10 * * ? * " 每天早上10:15觸發
"0 15 10 * * ? 2005" 2005年的每天早上10:15觸發
#" 0 * 14 * * ?" 每天從下午2點開始到2點59分每分鐘一次觸發
"0 0/5 14 * * ?" 每天從下午2點開始到2:55分結束每5分鐘一次觸發
"0 0/5 14,18 * * ?" 每天的下午2點至2:55和6點至6點55分兩個時間內每5分鐘一次觸發
"0 0-5 14 * * ?" 每天14:00至14:05每分鐘一次觸發 ##### ########"0 10,44 14 ? 3 WED" 三月的每週三的14:10和14:44觸發 #############"0 15 10 ? * MON-FRI" 每週一、二、三、四、五的10:15觸發 ######
以上是Spring定時任務之用法說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!