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
參考文章