1. 程式人生 > >Quartz框架支援分散式任務處理

Quartz框架支援分散式任務處理

一、問題分析

對於單機的任務排程,使用Quartz十分方便。但是在分散式情況下,對於叢集中每臺機器都會執行任務,從而造成了重複執行任務的問題。

二、解決思路

Quart不僅支援單機任務排程,同時也支援叢集中的任務排程。原理如下:

在叢集中,各個不同的機器公用同一個排程器,排程器按照一定的演算法選擇叢集中某一臺機器執行任務。

優點:

1、避免了每臺機器都進行任務排程

2、避免了所有任務在單機執行造成效能下降

三、解決方案

要啟用quartz的分散式任務排程處理,只需如下兩個步驟,同時程式無需修改:

(1)在資料庫中建立quartz需要的表。這些表由quartz自己維護,用於儲存資料和維護程式執行狀態,這些表對於程式設計師而言是透明的,不需要關注,只需建立好表即可。

(2)在工程的src下增加quartz.properties配置檔案,進行叢集相關操作的配置。

配置檔案如下:

#==============================================================  
#Configure Main Scheduler Properties  
#==============================================================   
#配置叢集時,quartz排程器的id,由於配置叢集時,只有一個排程器,必須保證每個伺服器該值都相同,可以不用修改,只要每個ams都一樣就行
org.quartz.scheduler.instanceName = Scheduler1    
#叢集中每臺伺服器自己的id,AUTO表示自動生成,無需修改
org.quartz.scheduler.instanceId = AUTO  
#==============================================================  
#Configure ThreadPool  
#==============================================================
#quartz執行緒池的實現類,無需修改   
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
#quartz執行緒池中執行緒數,可根據任務數量和負責度來調整  
org.quartz.threadPool.threadCount = 5   
#quartz執行緒優先順序
org.quartz.threadPool.threadPriority = 5  
#==============================================================  
#Configure JobStore  
#==============================================================   
#表示如果某個任務到達執行時間,而此時執行緒池中沒有可用執行緒時,任務等待的最大時間,如果等待時間超過下面配置的值(毫秒),本次就不在執行,而等待下一次執行時間的到來,可根據任務量和負責程度來調整
org.quartz.jobStore.misfireThreshold = 60000   
#實現叢集時,任務的儲存實現方式,org.quartz.impl.jdbcjobstore.JobStoreTX表示資料庫儲存,無需修改
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
#quartz儲存任務相關資料的表的字首,無需修改 
org.quartz.jobStore.tablePrefix = QRTZ_ 
#連線資料庫資料來源名稱,與下面配置中org.quartz.dataSource.myDS的myDS一致即可,可以無需修改  
org.quartz.jobStore.dataSource = myDS
#是否啟用叢集,啟用,改為true,注意:啟用集群后,必須配置下面的資料來源,否則quartz排程器會初始化失敗   
org.quartz.jobStore.isClustered = false  
#叢集中伺服器相互檢測間隔,每臺伺服器都會按照下面配置的時間間隔往伺服器中更新自己的狀態,如果某臺伺服器超過以下時間沒有checkin,排程器就會認為該臺伺服器已經down掉,不會再分配任務給該臺伺服器
org.quartz.jobStore.clusterCheckinInterval = 20000  
#==============================================================  
#Non-Managed Configure Datasource  
#==============================================================
#配置連線資料庫的實現類,可以參照IAM資料庫配置檔案中的配置   
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver  
#配置連線資料庫連線,可以參照IAM資料庫配置檔案中的配置  
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/test 
#配置連線資料庫使用者名稱
org.quartz.dataSource.myDS.user = yunxi
#配置連線資料庫密碼
org.quartz.dataSource.myDS.password = 123456
#配置連線資料庫連線池大小,一般為上面配置的執行緒池的2倍
org.quartz.dataSource.myDS.maxConnections = 10 

四、提示

不同專案只需修改資料庫連線即可