一、簡介
Quartz是一個完全由java編寫的開源作業調度框架,Quartz作為Java實現的工業標准級別的定時任務調度器,Spring對其提供了無縫的集成,並大大簡化了開發工作。
一個任務調度器最基本的三個元素是
-
Job(or Task):需要定時處理的事情
-
Trigger: 事件觸發時間點(一次性的、固定周期性的、像Linux Cron Jobs 靈活配置的)
-
Scheduler: 調度器
Job與Trigger是一對一的關系,Scheduler與Trigger是一對多的關系。
Quartz的Job對應類為JobDetail,Spring為簡化開發提供了工廠包裝類MethodInvokingJobDetailFactoryBean類,或使用JobDetailFactoryBean;
Quartz提供兩種Trigger,一是SimpleTrigger提供周期性定時觸發器,Spring的對工廠類為SimpleTriggerFactoryBean(注:SimpleTriggerBean不支持Quartz2以上版本,已經被SimpleTriggerFactoryBean替代);二是CronTrigger提供像Linux Cron Jobs那樣的復雜觸發器,觸發時間點使用Cron表達式定義,Cron表達式語法可以參考Quartz官方文檔,Spring的對應工廠類為CronTriggerFactoryBean(注:CronTriggerBean不支持Quartz2以上版本,已經被CronTriggerFactoryBean替代);
Quartz的Scheduler對應類為Scheduler,Spring對應工廠類為SchedulerFactoryBean。
二、Spring MVC中的實現
1、依賴的jar包
Quartz使用的類主要在spring-context-support-4.1.6-RELEASE.jar、quartz-2.1.1.jar中,其他環境所需的jar包參考Spring MVC(一)—— 最小環境搭建中的說明。
2、Quartz使用配置applicationContext-task.xml如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns:aop="http://www.springframework.org/schema/aop" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context 6 http://www.springframework.org/schema/context/spring-context.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 8 9 <!--- 觸發器的bean的設置,在這里我們設置了我們要觸發的jobDetail是哪個 --> 10 <bean id="testTimerTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 11 <property name="jobDetail"> 12 <bean id="testTimerJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> 13 <property name="jobClass" value="com.ruijie.crazy.timer.TestTimer" /> 14 <property name="group" value="TEST" /> 15 <property name="durability" value="true" /> 16 </bean> 17 </property> 18 <property name="cronExpression"> 19 <value>0 54 9 * * ?</value> <!-- 每天9點54分觸發一次 --> 20 </property> 21 </bean> 22 23 <!-- 管理觸發器的總設置,管理我們的觸發器列表,可以在bean的list中放置多個觸發器 --> 24 <bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 25 <property name="triggers"> 26 <list> 27 <ref bean="testTimerTrigger" /> 28 </list> 29 </property> 30 <property name="quartzProperties"> 31 <props> 32 <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop> 33 </props> 34 </property> 35 </bean> 36 37 </beans>
3、定時任務類的java實現:
1 package com.ruijie.crazy.timer; 2 3 import org.quartz.JobExecutionContext; 4 import org.quartz.JobExecutionException; 5 import org.springframework.scheduling.quartz.QuartzJobBean; 6 7 public class TestTimer extends QuartzJobBean { 8 9 @Override 10 protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { 11 System.out.println("TestTimer----"); // 實現定時任務的代碼 12 } 13 14 }
至此,Spring MVC與Quartz集成的事情就全部搞定了。