Quartzspring
Quartz是一個徹底由Java編寫的開源做業調度框架,爲在Java應用程序中進行做業調度提供了簡單卻強大的機制。Quartz容許開發人員根據時間間隔來調度做業。它實現了做業和觸發器的多對多的關係,還能把多個做業與不一樣的觸發器關聯。簡單地建立一個org.quarz.Job接口的Java類,Job接口包含惟一的方法execute()。在Job接口實現類裏面,添加須要的邏輯到execute()方法中。配置好Job實現類並設定好調度時間表,Quartz就會自動在設定的時間調度做業執行execute()。併發
Spring與Quartz框架
Spring很好的封裝了Quartz的細節,先介紹Spring建立JobDetail的方式,這裏僅介紹經過透明的使用Quartz達到定時任務開發的目的。spa
經過配置Spring的任務調度抽象層簡化了任務調度,在Quartz的基礎上提供了更好的調度對象。Spring使用Quartz框架來完成任務調度,建立Quartz的做業Bean(JobDetail),利用MethodInvokingJobDetailFactoryBean工廠Bean包裝普通的Java對象(即Job類),建立Job類,無須繼承父類,直接配置MethodInvokingJobDetailFactoryBean便可。但須要指定一下兩個屬性。code
targetObject:指定包含任務執行體的Bean實例。對象
targetMethod:指定將指定Bean實例的該方法包裝成任務的執行體。blog
例子以下:繼承
<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方法就好了,系統會根據配置定時觸發該方法。
最後須要注意的是