一、关于Quartz集群的说明
Quartz的集群部署方案在架构上是分布式的,每个节点是一个独立的Quartz应用,并不与另一个节点或是管理节点通信,没有负责集中管理的节点。
Quartz是通过数据库表来感知另一应用,利用数据库锁的方式来实现集群并完成对并发的控制。所以,分布式部署时需要保证各个节点的系统时间一致。
二、配置Spring的配置文件
<!-- 调度工厂 -->
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 调度器配置:引入文件方式 -->
<property name="configLocation" value="classpath:quartz.properties"/>
<!-- 调度器配置:直接配置方式
<property name="quartzProperties"><props><prop key=""></prop></props></property> -->
<!-- 调度器名称 -->
<property name="schedulerName" value="CRMscheduler" />
<!-- QuartzScheduler 延时启动,应用启动完后多久再启动 -->
<property name="startupDelay" value="30" />
<!-- 把Spring的上下文作用这个属性的值作为key存储到quartz的上下文中。后续可以在quartz的上下文中通过这个值获取Spring的上下文 -->
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<!-- QuartzScheduler 启动时更新己存在的Job。适用于修改了Trigger以后自动更新,不用手工改删数据库表 -->
<property name="overwriteExistingJobs" value="true" />
<!-- 设置自动启动 -->
<property name="autoStartup" value="true" />
<!-- 注册触发器 -->
<property name="triggers">
<list>
<ref bean="exampleClusterJobTrigger" />
</list>
</property>
</bean>
<!--定义调度器-->
<bean id="exampleClusterJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="exampleClusterJob"/>
<property name="targetMethod" value="doJob"/>
<property name="concurrent" value="false"/>
</bean>
<!--定义触发器-->
<bean id="exampleClusterJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="exampleClusterJobDetail"/>
<property name="cronExpression">
<value>0 0 3 * * ?</value>
</property>
</bean>
三、Quartz常用属性配置
# ===========================================================================
# 调度器属性
# ===========================================================================
# 调度器实例名 集群中所有实例应该设置为相同
org.quartz.scheduler.instanceName=TstQuartzScheduler
# 实例Id,每个实例必须唯一,设置为自动即可
org.quartz.scheduler.instanceid:AUTO
# ===========================================================================
# 线程池属性
# ===========================================================================
# 线程池的实现类
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
# 指定线程数,至少为1(无默认值,一般设置为1-100之间比较合适)
org.quartz.threadPool.threadCount=10
# 设置线程的优先级(最大为java.lang.Thread.MAX_PRIORITY 10,最小为Thread.MIN_PRIORITY 1,默认为5)
org.quartz.threadPool.threadPriority=5
# ===========================================================================
# 集群配置
# ===========================================================================
# 数据库中存储调度信息的表的前缀
org.quartz.jobStore.tablePrefix=QRTZ_
# 触发器(Trigger)超时(Misfire)的最大时间
org.quartz.jobStore.misfireThreshold=6000
# 触发最大Misfire的次数
org.quartz.jobStore.maxMisfiresToHandleAtATime=10
# 存储调度信息的模式
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
# 数据库方言
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
# 是否是集群
org.quartz.jobStore.isClustered=true
# 集群的状态更新时间间隔
org.quartz.jobStore.clusterCheckinInterval=15000
四、Quartz数据库核心表
QRTZ_CALENDARS 存储Quartz的Calendar信息
QRTZ_CRON_TRIGGERS 存储CronTrigger,包括Cron表达式和时区信息
QRTZ_FIRED_TRIGGERS 存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息
QRTZ_PAUSED_TRIGGER_GRPS 存储已暂停的Trigger组的信息
QRTZ_SCHEDULER_STATE 存储少量的有关Scheduler的状态信息,和别的Scheduler实例
QRTZ_LOCKS 存储程序的悲观锁的信息
QRTZ_JOB_DETAILS 存储每一个已配置的Job的详细信息
QRTZ_JOB_LISTENERS 存储有关已配置的JobListener的信息
QRTZ_SIMPLE_TRIGGERS 存储简单的Trigger,包括重复次数、间隔、以及已触的次数
QRTZ_BLOG_TRIGGERS Trigger作为Blob类型存储
QRTZ_TRIGGER_LISTENERS 存储已配置的TriggerListener的信息
QRTZ_TRIGGERS 存储已配置的Trigger的信息