quartz.properties配置文件详解
我們通常是通過quartz.properties屬性配置文件(默認(rèn)情況下均使用該文件)結(jié)合StdSchedulerFactory?來使用Quartz的。StdSchedulerFactory?會加載屬性配置文件并實(shí)例化一個Scheduler。
?
默認(rèn)情況下,Quartz會加載classpath下的”quartz.properties”文件作為配置屬性,如果找不到則會使用quartz框架自己jar下org/quartz包底下的”quartz.properties”文件。當(dāng)然你也可以指定”org.quartz.properties”屬性指向你自定義的屬性配置文件。或者,你也可以在調(diào)用StdSchedulerFactory的 getScheduler()方法之前調(diào)用 initialize(xx)初始化factory配置。
?
在配置文件中你可以使用”$@”引用其他屬性配置。
?
#============================================================================
#?Configure Main Scheduler Properties 調(diào)度器屬性
#============================================================================
# 在集群中每個實(shí)例都必須有一個唯一的instanceId,但是應(yīng)該有一個相同的instanceName【默認(rèn)“QuartzScheduler”】【非必須】
org.quartz.scheduler.instanceName = MyClusteredScheduler
# Scheduler實(shí)例ID,全局唯一,【默認(rèn)值NON_CLUSTERED】,或者可以使用“SYS_PROP”通過系統(tǒng)屬性設(shè)置id。【非必須】
org.quartz.scheduler.instanceId = AUTO
#?只有在”org.quartz.scheduler.instanceId”設(shè)置為”AUTO”的時候才使用該屬性設(shè)置。
# 默認(rèn)情況下,“org.quartz.simpl.SimpleInstanceIdGenerator”是基于instanceId和時間戳來自動生成的。
# 其他的id生成器的實(shí)現(xiàn)包括 SystemPropertyInstanceIdGenerator 從系統(tǒng)屬性獲取 “org.quartz.scheduler.instanceId”, 和 HostnameInstanceIdGenerator 使用主機(jī)名 (InetAddress.getLocalHost().getHostName())。也可以自定義生成方式【默認(rèn)org.quartz.simpl.SimpleInstanceIdGenerator】【非必須】
#org.quartz.scheduler.instanceIdGenerator.class =?org.quartz.simpl.SimpleInstanceIdGenerator
#?指定線程名,如果不指定的話,會自動使用org.quartz.scheduler.instanceName屬性值加上后綴字符串”_QuartzSchedulerThread”.【默認(rèn)instanceName+’_QuartzSchedulerThread’】【非必須】
#org.quartz.scheduler.threadName =?
#?指定scheduler的主線程是否為后臺線程,【默認(rèn)false】【非必須】
#org.quartz.scheduler.makeSchedulerThreadDaemon = false
#?指定Quartz生成的線程是否繼承初始化線程的上下文類加載器。這會影響Quartz的主調(diào)度線程、JDBCJobStore的”熄火”處理線程、集群回復(fù)線程和線程池里的線程。 將該值設(shè)置為“true”可以幫助類加載,JNDI查找,并在應(yīng)用程序服務(wù)器上使用Quartz等相關(guān)問題,【默認(rèn)false】【非必須】
#org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer = false
#?在調(diào)度程序空閑的時候,重復(fù)查詢是否有可用觸發(fā)器的等待時間。通常并不會設(shè)置為true,除非你是用XA事務(wù),并且延遲觸發(fā)會導(dǎo)致問題的場景。 5000ms以下是不推薦的,因?yàn)樗鼤?dǎo)致過的的數(shù)據(jù)庫查詢。1000ms以下是非法的。【默認(rèn)30000】【非必須】
#org.quartz.scheduler.idleWaitTime =?30000
#?連接超時重試連接的間隔。使用 RamJobStore時,該參數(shù)并沒什么用【默認(rèn)15000】【非必須】
#org.quartz.scheduler.dbFailureRetryInterval = 15000
# 最可靠的方式就是使用【默認(rèn)”org.quartz.simpl.CascadingClassLoadHelper”】,沒必要指定其他類【非必須】
#org.quartz.scheduler.classLoadHelper.class =?org.quartz.simpl.CascadingClassLoadHelper
# 指定JobFactory的類(接口)名稱。負(fù)責(zé)實(shí)例化jobClass。【默認(rèn)”org.quartz.simpl.PropertySettingJobFactory”】,只是在job被執(zhí)行的時候簡單調(diào)用newInstance()實(shí)例化一個job類。PropertySettingJobFactory 會使用反射機(jī)制通過SchedulerContext、 Job、Trigger和 JobDataMaps設(shè)置job bean的屬性。在使用JTA事務(wù)時,可設(shè)置事務(wù)相關(guān)的屬性【非必須】
#org.quartz.scheduler.jobFactory.class =?org.quartz.simpl.PropertySettingJobFactory
#org.quartz.context.key.SOME_KEY = none
# 設(shè)置Quartz能夠加載UserTransaction換利器的JNDI的 URL。Websphere 的用戶可能會設(shè)置為“jta/usertransaction。只有在Quartz使用JobStoreCMT的時候,才會使用該屬性,并且org.quartz.scheduler.wrapJobExecutionInUserTransaction也會設(shè)置為true。默認(rèn)【默認(rèn)值是”java:comp/UserTransaction”】【非必須】
#org.quartz.scheduler.userTransactionURL =?java:comp/UserTransaction
#?如果想使用Quartz在執(zhí)行一個job前使用UserTransaction,則應(yīng)該設(shè)置該屬性為true。job執(zhí)行完、在JobDataMap改變之后事務(wù)會提交。默認(rèn)值是false。 可以在你的job類中使用 @ExecuteInJTATransaction注解, 可以控制job是否使用事務(wù)。【默認(rèn)false】【非必須】
#org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
# 建議設(shè)置為“org.terracotta.quartz.skipUpdateCheck=true”不會在程序運(yùn)行中還去檢查quartz是否有版本更新。【默認(rèn)false】【非必須】
#org.quartz.scheduler.skipUpdateCheck?=?true
# 許調(diào)度程序一次性觸發(fā)的觸發(fā)器數(shù)量。.默認(rèn)值是1。值越大一次性觸發(fā)的任務(wù)就可以越多,但是在集群環(huán)境【非必須】下,不建議設(shè)置為很大值。如果值 > 1, 并且使用了 JDBC JobStore的話, org.quartz.jobStore.acquireTriggersWithinLock屬性必須設(shè)置為true,以避免”弄臟”數(shù)據(jù)。【默認(rèn)1】
#org.quartz.scheduler.batchTriggerAcquisitionMaxCount = 1
# 允許觸發(fā)器被獲取并在其預(yù)定的觸發(fā)時間之前觸發(fā)的數(shù)量。【默認(rèn)0】【非必須】
#org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow = 0
?
#============================================================================
#?Configure ThreadPool 線程池屬性
#============================================================================
# 線程池的實(shí)現(xiàn)類(定長線程池,幾乎可滿足所有用戶的需求)【默認(rèn)null】【必須】
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 指定線程數(shù),至少為1(無默認(rèn)值)(一般設(shè)置為1-100直接的整數(shù)合適)【默認(rèn)-1】【必須】
org.quartz.threadPool.threadCount = 25
# 設(shè)置線程的優(yōu)先級(最大為java.lang.Thread.MAX_PRIORITY 10,最小為Thread.MIN_PRIORITY 1)【默認(rèn)Thread.NORM_PRIORITY (5)】【非必須】
org.quartz.threadPool.threadPriority = 5
?
# ------------------設(shè)置SimpleThreadPool的一些屬性,一般使用默認(rèn)值-------------------------------
# 設(shè)置是否為守護(hù)線程
#org.quartz.threadpool.makethreadsdaemons = false
#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#org.quartz.threadpool.threadsinheritgroupofinitializingthread = false
#線程前綴默認(rèn)值是:[Scheduler Name]_Worker
#org.quartz.threadpool.threadnameprefix = swhJobThead;
?
# ------------------------配置全局監(jiān)聽(TriggerListener,JobListener) 則應(yīng)用程序可以接收和執(zhí)行 預(yù)定的事件通知
# Configuring a Global TriggerListener 配置全局的Trigger監(jiān)聽器。
# MyTriggerListenerClass 類必須有一個無參數(shù)的構(gòu)造函數(shù),和 屬性的set方法,目前2.2.x只支持原始數(shù)據(jù)類型的值(包括字符串)
#org.quartz.triggerListener.NAME.class = com.swh.MyTriggerListenerClass
#org.quartz.triggerListener.NAME.propName = propValue
#org.quartz.triggerListener.NAME.prop2Name = prop2Value
# Configuring a Global JobListener 配置全局的Job監(jiān)聽器
# MyJobListenerClass 類必須有一個無參數(shù)的構(gòu)造函數(shù),和 屬性的set方法,目前2.2.x只支持原始數(shù)據(jù)類型的值(包括字符串)
#org.quartz.jobListener.NAME.class = com.swh.MyJobListenerClass
#org.quartz.jobListener.NAME.propName = propValue
#org.quartz.jobListener.NAME.prop2Name = prop2Value
?
#============================================================================
#?Configure JobStore?配置數(shù)據(jù)存儲的方式
#============================================================================
# ------------------------使用RAMJobStore配置
# 將schedule相關(guān)信息保存在RAM中,輕量級,速度快,遺憾的是應(yīng)用重啟時相關(guān)信息都將丟失。
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#?最大能忍受的觸發(fā)超時時間(觸發(fā)器被認(rèn)定為“misfired”之前),如果超過則認(rèn)為“失誤”【默認(rèn)60秒】
org.quartz.jobStore.misfireThreshold = 60000
?
# ------------------------使用JDBCJobStore配置
# 所有的quartz數(shù)據(jù)例如job和Trigger的細(xì)節(jié)信息被保存在內(nèi)存或數(shù)據(jù)庫中,有兩種實(shí)現(xiàn):JobStoreTX(自己管理事務(wù))和JobStoreCMT(application server管理事務(wù),即全局事務(wù)JTA)
org.quartz.jobStore.class =?org.quartz.impl.jdbcjobstore.JobStoreTX
#?最大能忍受的觸發(fā)超時時間(觸發(fā)器被認(rèn)定為“misfired”之前),如果超過則認(rèn)為“失誤”【默認(rèn)60秒】
org.quartz.jobStore.misfireThreshold = 60000
#?類似于Hibernate的dialect,用于處理DB之間的差異,StdJDBCDelegate能滿足大部分的DB
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 配置數(shù)據(jù)源的名稱,在后面配置數(shù)據(jù)源的時候要用到,例如org.quartz.dataSource.clusterDS.driver =?com.mysql.jdbc.Driver
org.quartz.jobStore.dataSource = clusterDS
# 數(shù)據(jù)表前綴
?org.quartz.jobStore.tablePrefix = QRTZ_
#?為了指示JDBCJobStore所有的JobDataMaps中的值都是字符串,并且能以“名字-值”對的方式存儲而不是以復(fù)雜對象的序列化形式存儲在BLOB字段中,應(yīng)該設(shè)置為true(缺省方式)
org.quartz.jobStore.useProperties = true
# 是否集群、負(fù)載均衡、容錯,如果應(yīng)用在集群中設(shè)置為false會出錯
org.quartz.jobStore.isClustered = true
# 檢入到數(shù)據(jù)庫中的頻率(毫秒)。檢查是否其他的實(shí)例到了應(yīng)當(dāng)檢入的時候未檢入這能指出一個失敗的實(shí)例,且當(dāng)前Scheduler會以此來接管執(zhí)行失敗并可恢復(fù)的Job通過檢入操作,Scheduler也會更新自身的狀態(tài)記錄
org.quartz.jobStore.clusterCheckinInterval = 20000
#?jobStore處理未按時觸發(fā)的Job的數(shù)量
#org.quartz.jobStore.maxMisfiresToHandleAtATime = 20
#?true/false,true則調(diào)用connection的setAutoCommit(false)方法
org.quartz.jobStore.dontSetAutoCommitFalse = true
#?加鎖的SQL語句,默認(rèn)為SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE
# {0}=$@org.quartz.jobStore.tablePrefix
org.quartz.jobStore.selectWithLockSQL = false
#?true/false, true則調(diào)用connection的setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE) 方法
org.quartz.jobStore.txIsolationLevelSerializable = false
#?觸發(fā)job時是否需要擁有鎖
org.quartz.jobStore.acquireTriggersWithinLock = true
# 用于管理數(shù)據(jù)庫中相關(guān)信息的鎖機(jī)制的類名
org.quartz.jobStore.lockHandler.class =?
?
#============================================================================
#?Configure?Datasources 數(shù)據(jù)源
#============================================================================
# ------------------------使用常規(guī)數(shù)據(jù)源配置
# 數(shù)據(jù)庫驅(qū)動
org.quartz.dataSource.NAME.driver = com.mysql.jdbc.Driver
# 數(shù)據(jù)庫連接地址
org.quartz.dataSource.NAME.URL = jdbc:mysql://${mysql.address}/etc-quartz?useUnicode=true&characterEncoding=utf8
# 數(shù)據(jù)庫用戶名
org.quartz.dataSource.NAME.user = ${mysql.user}
# 數(shù)據(jù)庫密碼
org.quartz.dataSource.NAME.password = ${mysql.password}
# 數(shù)據(jù)庫最大連接數(shù)(如果Scheduler很忙,比如執(zhí)行的任務(wù)與線程池的數(shù)量差不多相同,那就需要配置DataSource的連接數(shù)量為線程池數(shù)量+1)
org.quartz.dataSource.NAME.maxConnections = 30
#?dataSource用于檢測connection是否failed/corrupt的SQL語句
org.quartz.dataSource.NAME.validationQuery=select RAND()
?
# ------------------------使用JNDI數(shù)據(jù)源配置
# JNDI URL
org.quartz.dataSource.NAME.jndiURL =?
# JNDI InitialContextFactory
org.quartz.dataSource.NAME.java.naming.factory.initial =?
# 后三行為連接到JNDI提供者的相關(guān)信息
org.quartz.dataSource.NAME.java.naming.provider.url =?
org.quartz.dataSource.NAME.java.naming.security.principal?=?
org.quartz.dataSource.NAME.java.naming.security.credentials?=?
?
# ------------------------用戶自定義org.quartz.utils.ConnectionProvider實(shí)現(xiàn)類
org.quartz.dataSource.NAME.connectionProvider.class =?
org.quartz.dataSource.NAME.XXX =?
-----------
實(shí)現(xiàn)故障處理和負(fù)載均衡,實(shí)現(xiàn)高可用性和擴(kuò)展性通過共享DB Tables實(shí)現(xiàn),所以必須使用JDBC-Jobstore
負(fù)載均衡 :?誰先觸發(fā)誰執(zhí)行,并且一次只有一個scheduler觸發(fā)
故障處理 :?當(dāng)一個scheduler失敗后,其它的實(shí)例可以發(fā)現(xiàn)那些執(zhí)行失敗的Jobs,假如Job對應(yīng)的JobDetail標(biāo)記為recovery(屬性"requests recovery"),那么該Job就會被其它的實(shí)例重新執(zhí)行,否則對應(yīng)的Job只會被釋放等待下次被觸發(fā)。
實(shí)現(xiàn):
org.quartz.jobStore.isClustered = true
所有的實(shí)例的quartz.properties文件除了org.quartz.scheduler.instanceId和org.quartz.threadPool.threadCount必須一致,org.quartz.scheduler.instanceId = AUTO 即可實(shí)現(xiàn)ID的不一致
注意:
1.不在不同的機(jī)器上實(shí)現(xiàn)集群功能,除非他們的時鐘同步精確到秒
2.不實(shí)現(xiàn)集群的實(shí)例不使用同一套表
#============================================================================
#?Configure?Plugins 插件配置
#============================================================================
#?配置trigger執(zhí)行歷史日志(可以看到類的文檔和參數(shù)列表)
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}
org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}
?
#?加載 Job 和 Trigger 信息的類 (1.8之前用:org.quartz.plugins.xml.JobInitializationPlugin)
#org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
#?指定存放調(diào)度器(Job 和 Trigger)信息的xml文件,默認(rèn)是classpath下quartz_jobs.xml
#org.quartz.plugin.jobInitializer.fileNames = quartz_data.xml
#org.quartz.plugin.jobInitializer.failOnFileNotFound = true
#?覆蓋任務(wù)調(diào)度器中同名的jobDetail,避免只修改了CronExpression所造成的不能重新生效情況
#org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
# 自動掃描任務(wù)單并發(fā)現(xiàn)改動的時間間隔,單位為秒。設(shè)置為0表示不自動加載
org.quartz.plugin.jobInitializer.scanInterval = 120
# 覆蓋任務(wù)調(diào)度器中同名的jobDetail,避免只修改了CronExpression所造成的不能重新生效情況
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
?
?
# ===========================================================================??
#?Sample configuration of ShutdownHookPlugin? ShutdownHookPlugin插件的配置樣例
# ===========================================================================
#org.quartz.plugin.shutdownhook.class = \org.quartz.plugins.management.ShutdownHookPlugin
#org.quartz.plugin.shutdownhook.cleanShutdown = true
# Configure RMI Settings 遠(yuǎn)程服務(wù)調(diào)用配置
# 如果你想quartz-scheduler出口本身通過RMI作為服務(wù)器,然后設(shè)置“出口”標(biāo)志true(默認(rèn)值為false)。
#org.quartz.scheduler.rmi.export = false
# 主機(jī)上rmi注冊表(默認(rèn)值localhost)
#org.quartz.scheduler.rmi.registryhost = localhost
# 注冊監(jiān)聽端口號(默認(rèn)值1099)
#org.quartz.scheduler.rmi.registryport = 1099
# 創(chuàng)建rmi注冊,false/never:如果你已經(jīng)有一個在運(yùn)行或不想進(jìn)行創(chuàng)建注冊
# true/as_needed:第一次嘗試使用現(xiàn)有的注冊,然后再回來進(jìn)行創(chuàng)建
# always:先進(jìn)行創(chuàng)建一個注冊,然后再使用回來使用注冊
#org.quartz.scheduler.rmi.createregistry = never
#Quartz Scheduler服務(wù)端端口,默認(rèn)是隨機(jī)分配RMI注冊表
#org.quartz.scheduler.rmi.serverport = 1098
# true:鏈接遠(yuǎn)程服務(wù)調(diào)度(客戶端),這個也要指定registryhost和registryport,默認(rèn)為false
# 如果export和proxy同時指定為true,則export的設(shè)置將被忽略
?
# ===========================================================================
# Configuring a Global TriggerListener 配置全局的Trigger監(jiān)聽器
# MyTriggerListenerClass 類必須有一個無參數(shù)的構(gòu)造函數(shù),和 屬性的set方法,目前2.2.x只支持原始數(shù)據(jù)類型的值(包括字符串)
# ===========================================================================
#org.quartz.triggerListener.NAME.class = com.swh.MyTriggerListenerClass
#org.quartz.triggerListener.NAME.propName = propValue
#org.quartz.triggerListener.NAME.prop2Name = prop2Value
# ===========================================================================
# Configuring a Global JobListener 配置全局的Job監(jiān)聽器
# MyJobListenerClass 類必須有一個無參數(shù)的構(gòu)造函數(shù),和 屬性的set方法,目前2.2.x只支持原始數(shù)據(jù)類型的值(包括字符串)
# ===========================================================================
#org.quartz.jobListener.NAME.class = com.swh.MyJobListenerClass
#org.quartz.jobListener.NAME.propName = propValue
#org.quartz.jobListener.NAME.prop2Name = prop2Value
?
僅供參考
總結(jié)
以上是生活随笔為你收集整理的quartz.properties配置文件详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中几个主流的数据库连接池
- 下一篇: 创建Maven项目时,GroupId和A