- 文件加載位置
默認:優先順序 Classpath:quartz.properties --> org/quartz/quartz.properties (quartz lib)
改變默認:設置一個系統屬性"org.quartz.properties"指向對應的properties文件
- 程序中顯示指定
在StdSchedulerFactory.getScheduler()之前使用StdSchedulerFactory.initialize(xx)。
- properties文件中的屬性關系
固定前綴org.quartz
主要分為scheduler,ThreadPool,JobStore,plugin等等部分
例如ThreadPool的配置信息
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 5
實例化ThreadPool的時候使用org.quartz.simpl.SimpleThreadPool,
實例化結束后threadCount,threadPriority 將以setter的形式注入到ThreadPool實例中
- 屬性值的復用
$propertyName
$@org.quartz.scheduler.instanceName
- 官方配置文檔
http://www.quartz-scheduler.org/documentation/quartz-1.x/configuration/
- threadPool
#Quartz ThreadPool
org.quartz.threadPool.class=threadPool類名(SimpleThreadPool就好)
org.quartz.threadPool.threadCount=thread數量,不會動態增長(所有的JOB)
org.quartz.threadPool.threadPriority=thread優先級
#Quartz SimpleThreadPool(使用默認就好)
#org.quartz.threadPool.makeThreadsDaemons=true/false是否為守護線程
#org.quartz.threadPool.threadsInheritGroupOfInitializingThread=true/false
#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true/false
- jobStore
1)RAMJobStore
將schedule相關信息保存在RAM中,輕量級,速度快,遺憾的是應用重啟時相關信息都將丟失。
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.misfireThreshold = 60000
misfireThreshold : 最大能忍受的觸發超時時間,如果超過則認為“失誤”
2)JDBC-JobStore
將schedule相關信息保存在RDB中.有兩種實現:JobStoreTX和JobStoreCMT
前者為application自己管理事務
后者為application server管理事務,即全局事務JTA
JobStoreTX
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass
#類似於Hibernate的dialect,用於處理DB之間的差異,StdJDBCDelegate能滿足大部分的DB
org.quartz.jobStore.dataSource
#這個值必須存於一個datasource的配置信息
#org.quartz.dataSource.XXX.driver...
org.quartz.jobStore.tablePrefix
#存儲相關信息表的前綴
org.quartz.jobStore.useProperties
#JobDataMaps是否都為String類型
org.quartz.jobStore.misfireThreshold
#與RAMJobStore中的一致
org.quartz.jobStore.isClustered
#是否是應用在集群中,當應用在集群中時必須設置為TRUE,否則會出錯org.quartz.jobStore.clusterCheckinInterval
#scheduler的checkin時間,時間長短影響failure scheduler的發現速度
org.quartz.jobStore.maxMisfiresToHandleAtATime
#jobStore處理未按時觸發的Job的數量
org.quartz.jobStore.dontSetAutoCommitFalse
#true/false,true則調用connection的setAutoCommit(false)方法
org.quartz.jobStore.selectWithLockSQL
#加鎖的SQL語句,默認為SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE
#{0}=$@org.quartz.jobStore.tablePrefix
org.quartz.jobStore.txIsolationLevelSerializable
#true/false, true則調用connection的setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE) 方法
org.quartz.jobStore.acquireTriggersWithinLock
#觸發job時是否需要擁有鎖
org.quartz.jobStore.lockHandler.class
#用於管理數據庫中相關信息的鎖機制的類名
- dataSource
建議最大的連接數最少為ThreadPool的threadCount,並且如果應用經常訪問scheduler的API的話最好是有一些額外的connection,也就是說要比ThreadPool的worker threads大一些
三種方式
1)datasource的相關信息全部定義於quartz.properties中,quartz自己創建datasource
org.quartz.dataSource.NAME.driver
org.quartz.dataSource.NAME.URL
org.quartz.dataSource.NAME.user
org.quartz.dataSource.NAME.password
org.quartz.dataSource.NAME.maxConnections
#以上為dataSource的基本屬性,大家都懂的
#NAME必須與$@org.quartz.jobStore.dataSource一致
org.quartz.dataSource.NAME.validationQuery
#dataSource用於檢測connection是否failed/corrupt的SQL語句
2)使用JNDI的datasource
org.quartz.dataSource.NAME.jndiURL
#JNDI URL
org.quartz.dataSource.NAME.java.naming.factory.initial
#JNDI InitialContextFactory
org.quartz.dataSource.NAME.java.naming.provider.url
org.quartz.dataSource.NAME.java.naming.security.principal
org.quartz.dataSource.NAME.java.naming.security.credentials
#后三行為連接到JNDI提供者的相關信息
3)用戶自定義org.quartz.utils.ConnectionProvider實現類
org.quartz.dataSource.NAME.connectionProvider.class
org.quartz.dataSource.NAME.XXX
- Cluster
實現故障處理和負載均衡,實現高可用性和擴展性
通過共享DB Tables實現,所以必須使用JDBC-Jobstore
負載均衡 : 誰先觸發誰執行,並且一次只有一個scheduler觸發
故障處理 : 當一個scheduler失敗后,其它的實例可以發現那些執行失敗的Jobs,假如Job對應的JobDetail標記為recovery(屬性"requests recovery"),那么該Job就會被其它的實例重新執行,否則對應的Job只會被釋放等待下次被觸發。
實現:
org.quartz.jobStore.isClustered = true
所有的實例的quartz.properties文件除了org.quartz.scheduler.instanceId和org.quartz.threadPool.threadCount必須一致,org.quartz.scheduler.instanceId = AUTO 即可實現ID的不一致
注意:
1.不在不同的機器上實現集群功能,除非他們的時鍾同步精確到秒
2.不實現集群的實例不使用同一套表