一、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的策略:
处理策略
描述
MISFIRE_INSTRUCTION_FIRE_ONCE_NOW
立即触发一次
MISFIRE_INSTRUCTION_DO_NOTHING
忽略,不处理,等待下次触发
之间的关系:
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" />
<!-- 配置项-->
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">${quartz.scheduler.instanceName}}</prop>
<prop key="org.quartz.scheduler.instanceId">hcs-crawl</prop>
<!-- 执行任务的线程池配置 -->
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">20</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
<!-- JobStore config -->
<!--单机模式:org.quartz.simpl.RAMJobStore -->
<!--集群模式:org.quartz.impl.jdbcjobstore.JobStoreTX, org.quartz.impl.jdbcjobstore.JobStoreCMT -->
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStore