Quartz - Spring整合Quartz實現叢集的定時任務

襲冷發表於2018-03-06

一、關於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的資訊




相關文章