一、关于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的信息