Quartz - Spring集成Quartz实现集群的定时任务

时间:2021-08-02 07:58:12

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