一、简介
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集成的事情就全部搞定了。