首頁 > Java > java教程 > 主體

Spring定時任務之用法說明

零下一度
發布: 2017-06-30 10:37:12
原創
1380 人瀏覽過

一.分類

  • 從實作的技術上來分類,目前主要有三種技術:

  1. Java自帶的java. util.Timer類,這個類別允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程式依照某一個頻度執行,但不能在指定時間運作。

  2. 使用Quartz,這是一個功能比較強大的的調度器,可以讓你的程式在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯複雜。

  3. Spring3.0以後自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。

  • 從作業類別的繼承方式來講,可以分成兩類:

  1. 作業類別需要繼承自特定的作業類基底類,如Quartz需要繼承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要繼承自java.util.TimerTask。

  2. 作業類別即普通的java類,不需要繼承自任何基底類別。

註:個人建議使用第二種方式,因為這樣所以的類別都是普通類,不需要事先區別對待。

 

  • 從任務排程的觸發時機來分,這裡主要是針對作業使用的觸發器,主要有以下兩種:
  1. 每隔指定時間則觸發一次,在Quartz中對應的觸發器為:org.springframework.scheduling.quartz.SimpleTriggerBean

  2. #每到指定時間則觸發一次,在Quartz中對應的調度器為:org.springframework.scheduling.quartz.CronTriggerBean

##註:並非每種任務都可以使用這兩種觸發器,如java.util.TimerTask任務就只能使用第一種。 Quartz和spring task都可以支援這兩種觸發條件。

二.用法說明

詳細介紹每種任務排程工具的使用方式,包括Quartz和spring task兩種。

Quartz

第一種,作業類別繼承自特定的基底類別:org.springframework.scheduling.quartz.QuartzJobBean。

第一步:定義作業類別

 

#Java程式碼  
Spring定時任務之用法說明
  1. #import org.quartz.JobExecutionContext;  

  2. ##import org.quartz.JobExecutionException;  ##import org.quartz.JobExecutionException;  ##import org.quartz.JobExecutionException;  

  3. 但是

    #import org.springframework.scheduling.quartz.QuartzJobBean;  
  4. #public 
  5. class Job1 
  6. extends Quartz

    public class Job1 ##JobbJobBeanfQuartzpublic 

    class Job1 #Job#JobBeanf {  
  7. #private #int timeout;  

  8. #private 
  9. static 
  10. int i = 

    0;  

Spring定時任務之用法說明
## ########//調度工廠實例化後,經過timeout時間開始執行調度  ##################public ###void setTimeout(### int timeout) {  #########################this.timeout = timeout;  ################} ###########################/** ##################* 要排程的特定任務 ##################*/  ############### ###@Override  ##################protected ###void executeInternal(JobExecutionContext context)  #################################1 ####throws JobExecutionException {  ###############  System.out.println(###"定時任務執行…");  ####################################################################################################################################################11 #####}  ############}  ################### 第二步驟:spring設定檔中設定作業類別JobDetailBean# ##############Xml程式碼  ##########
  1. bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean">  

  2. property #name= "jobClass" value="com.gy.Job1" />  

  3. property name="jobDataAsMap">  

  4. #map>  

  5. entry key="timeout" value="0" />  

  6. ##map#>  

property>  

##bean

>  

Spring定時任務之用法說明
# 說明:org.springframework.scheduling.quartz.JobDetailBean有兩個屬性,jobClass屬性即我們在java在程式碼中定義的任務類,jobDataAsMap屬性即該任務類別中需要注入的屬性值。
  1. 第三個步驟:設定作業排程的觸發方式(觸發器)

    #Quartz的作業觸發器有兩種,分別是org .springframework.scheduling.quartz.SimpleTriggerBeanorg.springframework.scheduling.quartz.CronTriggerBean第一種SimpleTriggerBean,只支援依照一定頻率呼叫任務,如每隔30分鐘執行一次。 設定方式如下: 

  2. Xml程式碼  
  3. bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  

  4. ##property name="jobDetail" #ref= "job1" />  

  5. #property 

    name=
  6. "startDelay" 
value=
"0" 

/>

  

Spring定時任務之用法說明
#################  #### #######################################bean###>  ########### #####################第二種CronTriggerBean,支援到指定時間運行一次,如每天12:00運行一次等。 ######設定方式如下:############Xml程式碼  #########
  1. bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  

  2. property #name= "jobDetail" ref="job1" />  

  3. >  

  4. property # name="cronExpression" value="0 0 12 * * ?" />  1

  5. #bean>  

 關於cronExpression表達式的語法請參考附錄。

第四步:設定調度工廠 

#Xml程式碼  Spring定時任務之用法說明
  1. #bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  

  2. property name="triggers">  

  3. #list>  

  4. #ref bean="cronTrigger" />  

  5. #

    list>  

property

>  

#

bean

>  

Spring定時任務之用法說明
  1. # 說明:此參數指定的是先前設定的觸發器的名字。 第五步:啟動你的應用程式即可,即將工程部署至tomcat或其他容器。

  2.  

     

    第二種,作業類別不繼承特定基底類別。
  3. Spring能夠支援這種方式,歸功於兩個類別:

    org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean
  4. org.springframework.scheduling.quartz.MethodInvoeanJobDetailFactoryB#org.springframework.scheduling.quartz.MethodInvoeanJobDetailFactoryB1Bean.

    ##這兩個類別分別對應spring支援的兩種實作任務調度的方式,即前文提到到java自帶的timer task方式和Quartz方式。這裡我只寫MethodInvokingJobDetailFactoryBean的用法,使用該類的好處是,我們的任務類不再需要繼承自任何類,而是普通的pojo。

第一步:寫任務類別

Java程式碼  

Spring定時任務之用法說明
###Java程式碼  ################# ####public ###class Job2 {  #####################public ###void doJob2() {  ########## #########System.out.println(###"不繼承QuartzJobBean方式-調度進行中...");  ###############}  # ###########}  ################ 可以看出,這就是一個普通的類,並且有一個方法。 #########第二步:設定作業類別###############Xml程式碼  #########
  1. bean id="job2"  

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

  3. # #property name="targetObject">  

  4. ##bean 

  5. class=
  6. "com.gy.Job2" 

    />   #property>  

  7. ##property name="targetMethod" value="doJob2" />  

#property 

name=

"concurrent" 

value=

"false" 

/>

  

Spring定時任務之用法說明
  1. ##bean>  

  2. # 說明:這一步是關鍵步驟,聲明一個MethodInvokingJobDetailFactoryBean,有兩個關鍵屬性:targetObject指定任務類,targetMethod指定執行的方法。往下的步驟就與方法一相同了,為了完整,同樣貼出。 第三個步驟:設定作業排程的觸發方式(觸發器)#Quartz的作業觸發器有兩種,分別是org .springframework.scheduling.quartz.SimpleTriggerBeanorg.springframework.scheduling.quartz.CronTriggerBean第一種SimpleTriggerBean,只支援依照一定頻率呼叫任務,如每隔30分鐘執行一次。 設定方式如下:

  3. Xml程式碼  

    bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  

  4. ##」
  5. #property 

    name=
  6. "jobDetail" 
ref=
"job2"

/>  

Spring定時任務之用法說明
############ ###########################################  ################### ################################bean###>  ################################################# ############### 第二種CronTriggerBean,支援到指定時間運行一次,如每天12:00運行一次等。 ######設定方式如下:############Xml程式碼  #########
  1. bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  

  2. property #name= "jobDetail" ref="job2" />  

  3. ##>  property # name="cronExpression" value="0 0 12 * * ?" />  

  4. 1

    #
  5. bean
>  

以上兩種調度方式依實際情況,任選一種即可。
Spring定時任務之用法說明第四步:設定調度工廠 
  1. #Xml程式碼   #bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"

    >  
  2. property name="triggers"

    >  
  3. #list>   #ref 

  4. bean=
  5. "cronTrigger" 

    />  

  6. #list

    >  

property

>  

#

bean

>  

Spring定時任務之用法說明
############### ############說明:此參數指定的是先前配置的觸發器的名字。 #########第五步:啟動你的應用程式即可,即將工程部署至tomcat或其他容器。 ######### ######到此,spring中Quartz的基本配置就介紹完了,當然了,使用之前,要導入對應的spring的包與Quartz的包,這些就不消多說了。 ######其實可以看出Quartz的配置看起來還挺複雜的,沒有辦法,因為Quartz其實是個重量級的工具,如果我們只是想簡單的執行幾個簡單的定時任務,有沒有更簡單的工具,有! ######請看我第下文Spring task的介紹。 ###### ######Spring-Task######上節介紹了在Spring 中使用Quartz,本文介紹Spring3.0以後自主開發的定時任務工具,spring task,可以將它比作一個輕量級的Quartz,而且使用起來很簡單,除spring相關的包外不需要額外的包,而且支援註解和配置文件兩種######形式,下面將分別介紹這兩種方式。 ######第一種:設定檔方式#########第一步:寫出作業類別##########即普通的pojo,如下:##### #######Java程式碼  ##########
  1. import org.springframework.stereotype.Service;  

  2. @Service  

  3. #public class TaskJob {  

  4.     public void job1() {  

  5.         System.out.println(“任務進行中。。。”);  

  6.     }  

  7. }  

 第二步驟:在spring設定檔頭中新增命名空間及描述

Xml程式碼  Spring定時任務之用法說明
  1. beans #xmlns= "http://www.springframework.org/schema/beans"  

  2.     xmlns:task="http://www.springframework.org/schema/task"   

  3. #    。 。 。 。 。 。

  4.     xsi:schemaLocation="http://www.springframework.org/schema/task "#>  

 第三步驟:在spring設定檔中設定特定的任務

Xml程式碼  Spring定時任務之用法說明
  1. ## task:scheduled-tasks>   

  2. #        
  3. #task:scheduled ref="taskJob" #method="job1" cron=##"0 #method="job1" cron=##"0 * * * ?"
  4. />   

Spring定時任務之用法說明
########################################################## #####task:scheduled-tasks###>  ######################################################################################################## ####  ###################/>  ############# #################說明:ref參數指定的即任務類,method指定的即需要運行的方法,cron及cronExpression表達式,具體寫法這裡不介紹了,詳情見上篇文章附錄。 ######這個配置不消多說了,spring掃描註解用的。 ######到這裡設定就完成了,是不是很簡單。 ######第二種:使用註解形式######也許我們不想每寫一個任務類別還要在xml檔案中配置下,我們可以使用註解@Scheduled,我們看看原始檔案中該註記的定義:############Java程式碼  ##########
  1. @Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.ANNOTATION_TYPE})  

  2. ##@Retention(RetentionPolicy.RUNTIME)  
  3. #@Documented  
  4. public 
  5. @interface Scheduled  

    {  

  6.   

    public 

    abstract String cron()#  
  7. public 
abstract String cron()#  
public 

abstract String cron() ;  

#  

public 

##  
public 
abstract Spring定時任務之用法說明long fixedDelay();  
  1. ##  public abstract 

    long fixedRate();  
  2. }  

  3. # 可以看出註解有三個方法或稱呼參數,分別表示的意思是:

    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.即從上一個任務開始到下一個任務開始的間隔,單位是毫秒。
  4.  

    下面我來設定一下。 第一步:寫pojo

  5. Java程式碼  

  6. #Java程式碼  
  7. import org.springframework.scheduling.annotation.Scheduled;    

import org.springframework.stereotype.Component;

Spring定時任務之用法說明
@Component(“taskJob”)  ##################public ### class TaskJob {  ###################    ###@Scheduled(cron = ####"0 0 3 *# #########    ###public ###void job1() {  ###################        System. 。二步:新增task相關的設定:###############Xml程式碼  ##########
  1. ##xml version="1.0" encoding="UTF-8"?>  

  2. ##beans xmlns= “ http://www.springframework.org/schema/beans”  

  3.     xmlns:xsi= " http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  

  4.     #xmlns:context="http://www.springframework.org/schema/context"  

  5. #    #xmlns:tx="http://www.springframework.org/schema/tx"  

  6.     xmlns:task="http://www.springframework.org/schema/task"  

  7.     

  8.     
  9. ##  xsi:schemaLocation =  

  10. ##         "       “假”>  

  11.     

    context:annotation-config />;      >  ##    

    #context:component-scan 
  12. base-package=

    "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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板