1. 程式人生 > >springboot和quartz整合分散式多節點

springboot和quartz整合分散式多節點

  雖然單個Quartz例項能給予我們很好的任務job排程能力,但它不能滿足典型的企業需求,如可伸縮性、高可靠性滿足。假如你需要故障轉移的能力並能執行日益增多的 Job,Quartz叢集勢必成為你應用的一部分了。使用 Quartz 的叢集能力可以更好的支援你的業務需求,並且即使是其中一臺機器在最糟的時間掛掉了也能確保所有的 Job 得到執行。一個 Quartz 叢集中的每個節點是一個獨立的 Quartz 應用,它又管理著其他的節點。也就是你必須對每個節點分別啟動或停止。不像許多應用伺服器的叢集,獨立的Quartz 節點並不與另一其的節點或是管理節點通訊。Quartz 應用是通過資料庫表來感知到另一應用的。

org.quartz.scheduler.instanceName = schedulerFactoryBean
#排程器編號自動生成,叢集中編號不可以重複,所以最好設成auto
org.quartz.scheduler.instanceId = AUTO

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

org.quartz.jobStore.tablePrefix 
= QRTZ_ #開啟分散式部署 org.quartz.jobStore.isClustered = true #分散式節點有效性檢查時間間隔,單位:毫秒 org.quartz.jobStore.clusterCheckinInterval = 10000 org.quartz.jobStore.useProperties = false org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 10 org.quartz.threadPool.threadPriority
= 5 #配置是否啟動自動載入資料庫內的定時任務,預設true org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

  啟動專案,埠號8081,作為第一個例項,可以看到之前我們加入的定時任務開始執行,修改埠號為8082,再啟動專案,作為第二個例項,可以看到沒有定時任務執行,然後我們手動down掉第一個例項,可以發現定時任務漂移到了我們的第二個例項,這樣就避免了單點故障而造成定時任務不執行的問題。

  Quartz一點都不明確你是在同一臺機器上執行所有節點,還是在不同的機器上執行所有節點。當叢集是放置在不同的機器上時,我們稱之為水平叢集。如果所有節點是跑在同一臺機器的時候,我們稱之為垂直叢集。對於垂直叢集,存在著單點故障的問題。這對高可用性的應用來說是個壞訊息,因為一旦機器宕掉了,所有的節點也就被有效的終止了。而當你執行水平叢集時,一個嚴格的要求就是我們的時鐘時間必須要同步,以免出現離奇且不可預知的行為。假如時鐘沒能夠同步,Scheduler 例項將對其他節點的狀態產生混亂,造成難以估計得麻煩。至於如何解決這個問題,後續遇到再做研究了。