Quartzs -- Quartz.properties 配置


  • 文件加載位置

默認:優先順序 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.不實現集群的實例不使用同一套表


免責聲明!

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



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