Spring對Quartz任務(wù)調(diào)度提供支持
Spring框架提供了豐富的Quartz任務(wù)調(diào)度支持,比如,在何時執(zhí)行何種任務(wù),它是一個開源的由OpenSymphony維護(hù)的項目,開發(fā)者能夠在 Java EE,或單獨的Java SE應(yīng)用中使用它。無論是簡單的任務(wù)調(diào)度,還是復(fù)雜的企業(yè)級應(yīng)用,Quartz都能夠很好地勝任。其中,這些任務(wù)可以是普通POJO,甚至還可以是EJB 3.0組件。
如果開發(fā)者需要開發(fā)如下方面的應(yīng)用,則Quartz是理想的選擇。
◆驅(qū)動工作流:比如,如果新創(chuàng)建的流程任務(wù)需要在2小時內(nèi)處理完,則在2小時后Quartz會檢查訂單是否成功處理。如果沒有處理,則Quartz會依據(jù)工作流定義的規(guī)則來對訂單進(jìn)行處理,銷毀它,或者進(jìn)行其他處理。
◆系統(tǒng)維護(hù)工作:比如,在每個工作日的固定時間將RDBMS中的內(nèi)容導(dǎo)出為XML文件。
Spring 2.0提供了org.springframework.scheduling.quartz包,以支持Quartz任務(wù)調(diào)度集成。為提供用戶的任務(wù),開發(fā)者實現(xiàn)的類必須繼承于quartz.QuartzJobBean抽象類。QuartzJobBean是Quartz中org.quartz.Job接口的簡單實現(xiàn)(子類),Spring為簡化Job接口的實現(xiàn)而提供了QuartzJobBean類。QuartzJobBean同Java 2 SDK中的TimerTask類似,用于定義任務(wù)本身。其中,executeInternal()方法定義待執(zhí)行的任務(wù),這同TimerTask中的 run()類似。下面給出了imagedb中ListImagesQuartzJob的定義,它同ListImagesTimerTask幾乎沒有區(qū)別。
- public class ListImagesQuartzJob extends QuartzJobBean {
- private ImageDatabase imageDatabase;
- private MailSender mailSender;
- private String mailFrom;
- private String mailTo;
- public void setImageDatabase(ImageDatabase imageDatabase) {
- this.imageDatabase = imageDatabase;
- }
- public void setMailSender(MailSender mailSender) {
- this.mailSender = mailSender;
- }
- public void setMailFrom(String mailFrom) {
- this.mailFrom = mailFrom;
- }
- public void setMailTo(String mailTo) {
- this.mailTo = mailTo;
- }
- protected void executeInternal(JobExecutionContext context) {
- ......
- logger.info("Next job execution at: " + context.getNextFireTime());
- }
- }
開發(fā)者可以通過executeInternal()方法指定待完成的用戶任務(wù),而通過傳入它的context能夠獲得任務(wù)執(zhí)行的上下文信息,比如,下次執(zhí)行用戶任務(wù)的時間。隨后,我們要指定相應(yīng)的調(diào)度規(guī)則,下面給出了context/WEB-INF/schedulingContext- quartz.xml中的相關(guān)配置信息。JobDetailBean是Quartz中org.quartz.JobDetail的子類,Spring為簡化JobDetail子類的開發(fā)而提供了JobDetailBean。借助于JobDetailBean中的jobClass屬性能夠設(shè)置Job對象類型,而借助于jobDataAsMap屬性能夠為ListImagesQuartzJob的各個屬性提供目標(biāo)取值。
- <bean id="listImagesJobDetail" class="org.springframework.scheduling.quartz.
- JobDetailBean">
- <property name="jobClass" value="org.springframework.samples.imagedb.
- scheduling.ListImagesQuartzJob"/>
- <property name="jobDataAsMap">
- <map>
- <entry key="imageDatabase" value-ref="imageDatabase"/>
- <entry key="mailSender" value-ref="mailSender"/>
- <entry key="mailFrom" value="${mail.from}"/>
- <entry key="mailTo" value="${mail.to}"/>
- map>
- property>
- bean>
- <bean id="listImagesTrigger" class="org.springframework.scheduling.quartz.
- SimpleTriggerBean">
- <property name="jobDetail" ref="listImagesJobDetail"/>
- <property name="startDelay" value="10000"/>
- <property name="repeatInterval" value="10000"/>
- bean>
SimpleTriggerBean是Quartz中org.quartz.SimpleTrigger的子類,為簡化SimpleTrigger 子類的開發(fā),Spring提供了它。為指定調(diào)度規(guī)則,開發(fā)者需要使用它設(shè)定運行任務(wù)的頻率和時機。SimpleTriggerBean同Timer任務(wù)調(diào)度中的ScheduledTimerTask類似,但功能上比它更強大。此時,SimpleTriggerBean暴露的startDelay屬性的含義同ScheduledTimerTask中的delay屬性,而repeatInterval屬性同period屬性。
為了指定更復(fù)雜的任務(wù)調(diào)度規(guī)則,開發(fā)者要使用Spring提供的CronTriggerBean,它是Quartz中 org.quartz.CronTrigger的子類,Spring 2.0為簡化CronTrigger子類的開發(fā)而提供了CronTriggerBean。CronTriggerBean比 SimpleTriggerBean功能更強大,它能夠控制任務(wù)執(zhí)行的精確時間,比如,早上九點半需要執(zhí)行某QuartzJobBean中給定的任務(wù)。借助于CronTriggerBean中的cronExpression屬性能夠設(shè)定任務(wù)的執(zhí)行時機。下面展示了相應(yīng)的配置示例。
- <bean id="checkImagesJobDetail"
- class="org.springframework.scheduling.quartz.
- MethodInvokingJobDetailFactoryBean">
- <property name="targetObject" ref="imageDatabase"/>
- <property name="targetMethod" value="checkImages"/>
- <property name="concurrent" value="true"/>
- bean>
- <bean id="checkImagesTrigger"
- class="org.springframework.scheduling.quartz.CronTriggerBean">
- <property name="jobDetail" ref="checkImagesJobDetail"/>
- <property name="cronExpression" value="0/5 * * * * ?"/>
- bean>
上述配置片斷還使用到MethodInvokingJobDetailFactoryBean,它能夠?qū)⑵胀ǖ腜OJO指定為用戶任務(wù)。這也是Spring Quartz任務(wù)調(diào)度集成支持的另一種指定用戶任務(wù)的策略。
在制訂上述2條調(diào)度規(guī)則后,開發(fā)者要實施它們,而SchedulerFactoryBean能夠擔(dān)當(dāng)此任,示例配置如下。借助于triggers屬性,開發(fā)者能夠指定由若干SimpleTriggerBean和CronTriggerBean構(gòu)成的集合;借助于quartzProperties屬性,開發(fā)者能夠控制Quartz的具體細(xì)節(jié),比如,線程池中線程的數(shù)量。
- <bean id="scheduler" class="org.springframework.scheduling.quartz.
- SchedulerFactoryBean">
- <property name="triggers">
- <list>
- <ref local="listImagesTrigger"/>
- <ref local="checkImagesTrigger"/>
- list>
- property>
- <property name="quartzProperties">
- <props>
- <prop key="org.quartz.threadPool.threadCount">5prop>
- props>
- property>
- bean>
【編輯推薦】