quartz的持久化任務調度使用應用的dataSource


Quartz提供兩種基本作業存儲類型
--->第一種類型叫做RAMJobStore:
     最佳的性能,因為內存中數據訪問最快
     不足之處是缺乏數據的持久性,當程序路途停止或系統崩潰時,所有運行的信息都會丟失
--->第二種類型叫做JDBC作業存儲:
     通過調整其quartz.properties屬性文件,持久化任務調度信息
     使用數據庫保存任務調度信息后,即使系統崩潰后重新啟動,任務的調度信息將得到恢復

 

如果部署應用多台服務器,定時任務在同一時刻只能有一個節點執行,那就必須使用第二種方案:持久化任務調度,通過Quartz默認的集群方案,保證同一時刻相同觸發器定時任務,只有一個節點去執行此任務!!!如果該節點執行失敗,則此任務則會被分派到另一節點執行,中途也會自動檢查失效的定時調度,發現不成功的,其他節點立馬接過來繼續完成定時任務。

默認的配置文件如下:

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
# StdSchedulerFactory使用quartz.properties 創建一個Quartz Scheduler實例
# 參數請參考:http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/
#
# Quartz提供兩種基本作業存儲類型
# --->第一種類型叫做RAMJobStore:
#     最佳的性能,因為內存中數據訪問最快
#     不足之處是缺乏數據的持久性,當程序路途停止或系統崩潰時,所有運行的信息都會丟失
# --->第二種類型叫做JDBC作業存儲:
#     通過調整其quartz.properties屬性文件,持久化任務調度信息
#     使用數據庫保存任務調度信息后,即使系統崩潰后重新啟動,任務的調度信息將得到恢復
#


#============================================================================
# 基礎配置
#============================================================================

# 設置調度器的實例名(instanceName) 和實例ID (instanceId)
# 注意:如果使用JobStoreTX,實例名嚴禁使用:DefaultQuartzScheduler
# 原因:內存方式的instanceid為默認的DefaultQuartzScheduler,如果不修改系統會同時存在內存型和DB型,默認會走內存
org.quartz.scheduler.instanceName: MyQuartzScheduler
#如果使用集群,instanceId必須唯一,設置成AUTO
org.quartz.scheduler.instanceId = AUTO

org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

#============================================================================
# 調度器線程池配置
#============================================================================

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
# 指定多少個工作者線程被創建用來處理 Job
org.quartz.threadPool.threadCount: 10
# 設置工作者線程的優先級(最大值10,最小值1,常用值5)
org.quartz.threadPool.threadPriority: 5
# 加載任務代碼的ClassLoader是否從外部繼承
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

org.quartz.jobStore.misfireThreshold: 60000

#============================================================================
# Configure JobStore 作業存儲配置
#============================================================================

# 默認配置,數據保存到內存(調度程序信息是存儲在被分配給JVM的內存里面,運行速度快)
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

# 持久化配置(存儲方式使用JobStoreTX,也就是數據庫)
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
# 驅動器方言
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 使用自己的配置文件
org.quartz.jobStore.useProperties:true

#數據庫中quartz表的表名前綴
org.quartz.jobStore.tablePrefix:qrtz_
org.quartz.jobStore.dataSource:myQuartzDB

#是否使用集群(如果項目只部署到 一台服務器,就不用了)
org.quartz.jobStore.isClustered = true

#============================================================================
# Configure Datasources配置數據源(可被覆蓋,如果在schedulerFactoryBean指定數據源)
#============================================================================

org.quartz.dataSource.myQuartzDB.driver:oracle.jdbc.OracleDriver
org.quartz.dataSource.myQuartzDB.URL:jdbc:oracle:thin:@10.132.81.134:1521:dsdb1
org.quartz.dataSource.myQuartzDB.user:masmf
org.quartz.dataSource.myQuartzDB.password:masmf
org.quartz.dataSource.myQuartzDB.maxConnections:10

 

其中,定義了Quartz的數據源。

如果Quartz的表結構和應用的表結構部署在同一個DB的schema下,則可以使用應用的datasource。我這里使用的SpringBoot,代碼如下:

/**
     * 配置SchedulerFactoryBean
     *
     * @return
     * @throws IOException
     */
    @Bean //將一個方法產生為Bean並交給Spring容器管理(@Bean只能用在方法上)
    public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("primaryDataSource") DataSource dataSource)
            throws IOException {
        //Spring提供SchedulerFactoryBean為Scheduler提供配置信息,並被Spring容器管理其生命周期
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        //啟動時更新己存在的Job,這樣就不用每次修改targetObject后刪除qrtz_job_details表對應記錄了
        //factory.setOverwriteExistingJobs(true);
        // 延時啟動(秒)
        //factory.setStartupDelay(20);
        //設置quartz的配置文件
        Properties QuartzPropertie = quartzProperties();
        factory.setQuartzProperties(QuartzPropertie);

        //設置數據源(使用系統的主數據源,覆蓋propertis文件的dataSource配置)
        factory.setDataSource(dataSource);

        //設置自定義Job Factory,用於Spring管理Job bean
        factory.setJobFactory(myJobFactory);
        return factory;
    }

關鍵代碼就2行:

1、注入應用的datasource:@Qualifier("primaryDataSource") DataSource dataSource

2、設置datatasource:factory.setDataSource(dataSource)

這里會自動覆蓋quartz.properties配置的數據源

 

如果使用xml配置,如下:

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <property name="dataSource" ref="dataSource"/>  
    <property name="overwriteExistingJobs" value="true"/>  
    <property name="configLocation" value="classpath:quartz.properties"/>  
</bean> 

 

具體SpringBoot下如何繼承Quartz,請參考前一片文章:SpringBoot集成Quartz

 

參考文章

SchedulerFactoryBean的初始化分析

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM