一、Quartz概念
Quartz是一个优秀的任务调度框架, 具有以下特点:
-
强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
-
负载均衡
-
高可用
调度器:scheduler
任务调度的控制器,负责定时任务的调度,并且提供任务和触发器的增删改查等api方法。
任务:job
job是实际被调度的任务,每个任务必须指定具体执行任务的实现类,实现类需要继承QuartzJobBean或者实现org.quartz.Job接口,具体的业务逻辑写在execute方法里面。
是否支持并发的注解:
@DisallowConcurrentExecution
触发器:trigger
trigger用来定义调度时间的概念,即按什么样时间规则去触发任务。主要几种类型:
-
SimpleTrigger
:简单触发器,从某个时间开始,每隔多少时间触发,重复多少次。 -
CronTrigger
:使用cron表达式定义触发的时间规则,如 "0 0 0,2,4 1/1 * ? *" 表示每天的0,2,4点触发。 -
DailyTimeIntervalTrigger
:每天中的一个时间段,每N个时间单元触发,时间单元可以是毫秒,秒,分,小时 -
CalendarIntervalTrigger
:每N个时间单元触发,时间单元可以是毫秒,秒,分,小时,日,月,年。
trigger状态:
WAITING,ACQUIRED,EXECUTING,COMPLETE,BLOCKED,ERROR,PAUSED,PAUSED_BLOCKED,DELETED
未正常触发的任务:misfire job
没有在正常触发时间点触发的任务。主要由一下几种情况导致:
-
触发时间在应用不可用的时间内,比如重启
-
上次的执行时间过长,超过了下次触发的时间
-
任务被暂停一段时间后,重新被调度的时间在下次触发时间之后
处理misfire job的策略,需要在创建trigger的时候配置,每种trigger对应的枚举值都不同,具体在接口里面有定义。CronTrigger有2种处理misfire的策略:
之间的关系:
-
scheduler由工厂类SchedulerFactory创建,主要负责job和trigger的持久化管理,包括新增、删除、修改、触发、暂停、恢复调度、停止调度等;
-
一个job可以关联多个trigger,但是一个trigger只能关联一个job。
二、集群模式
Quartz的集群模式指的是一个集群下多个节点管理同一批任务的调度,通过共享数据库的方式实现,保证同一个任务到达触发时间的时候,只有一台机器去执行该任务。每个节点部署一个单独的quartz实例,相互之间没有直接数据通信。

spring配置
<bean id="quartzJobFactory" class="com.taobao.trip.hcs.service.gubei.job.AutowiringSpringBeanJobFactory">
<property name="ignoredUnknownProperties" value="applicationContext"/>
</bean>
<!-- Scheduler Factory -->
<bean id="quartzScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="quartzJobFactory"/>
<!-- 数据源 -->
<property name="dataSource" ref="dataSource