Spring與Quartz的整合


Quartz

Quartz是一個完全由Java編寫的開源作業調度框架,為在Java應用程序中進行作業調度提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔來調度作業。它實現了作業和觸發器的多對多的關系,還能把多個作業與不同的觸發器關聯。簡單地創建一個org.quarz.Job接口的Java類,Job接口包含唯一的方法execute()。在Job接口實現類里面,添加需要的邏輯到execute()方法中。配置好Job實現類並設定好調度時間表,Quartz就會自動在設定的時間調度作業執行execute()。

Spring與Quartz

Spring很好的封裝了Quartz的細節,先介紹Spring創建JobDetail的方式,這里僅介紹通過透明的使用Quartz達到定時任務開發的目的。

通過配置Spring的任務調度抽象層簡化了任務調度,在Quartz的基礎上提供了更好的調度對象。Spring使用Quartz框架來完成任務調度,創建Quartz的作業Bean(JobDetail),利用MethodInvokingJobDetailFactoryBean工廠Bean包裝普通的Java對象(即Job類),創建Job類,無須繼承父類,直接配置MethodInvokingJobDetailFactoryBean即可。但需要指定一下兩個屬性。

   targetObject:指定包含任務執行體的Bean實例。

        targetMethod:指定將指定Bean實例的該方法包裝成任務的執行體。

例子如下:

<bean id="Synch21MessageJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="synch21MessageDisposeTask"/>
        <property name="targetMethod" value="synch21Message"/>
        <property name="concurrent" value="false"/>
    </bean>    

concurrent屬性是為了防止並發或者死鎖現象,true則為同時發生,對於相同的JobDetail,當指定多個Trigger時, 很可能第一個job完成之前,第二個job就開始了。定concurrent設為false,多個job不會並發運行,第二個job將不會在第一個job完成之前開始。

下面介紹觸發器,這里配置為簡單的觸發器。

<bean id="Synch21MessageTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail" ref="Synch21MessageJob"/>
        <property name="startDelay" value="10000"/>
        <property name="repeatInterval" value="3000"/>
    </bean>    

觸發時長間隔和開始延時都在這里進行設置。

另外還有一種觸發器CronTrigger,CronTrigger能夠提供復雜的觸發器表達式的支持。CronTrigger是基於Unix Cron守護進程,它是一個調度程序,支持簡單而強大的觸發器語法。

<bean id="receivedCaseCountJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="receivedCaseCountJob" />
     <!-- 指定Cron表達式:周一到周五7點、12點執行調度 -->     

      <property name="cronExpression"           value="0 0 7,12 ? * MON-FRI"/> 

    </bean>

 

下面還要配置調度器,需要將所有的觸發器都配置在list里面

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="Synch21MessageTrigger"/>
          <ref bean="receivedCaseCountJobTrigger" />

            </list>
        </property>
    </bean>  
 
        

這樣,只要實現synch21MessageDisposeTask對應的類中synch21Message方法就行了,系統會根據配置定時觸發該方法。

最后需要注意的是

將spring核心jar包、quartz.jar和Spring-context-support.jar導入類路徑

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM