1. 程式人生 > >quartz詳解1:初步瞭解quartz

quartz詳解1:初步瞭解quartz

http://blog.itpub.net/11627468/viewspace-1763389/

一、引入

      你曾經需要應用執行一個任務嗎?這個任務每天或每週星期二晚上11:30,或許僅僅每個月的最後一天執行。一個自動執行而無須干預的任務在執行過程中如果發生一個嚴重錯誤,應用能夠知到其執行失敗並嘗試重新執行嗎?你和你的團隊是用Java程式設計嗎?如果這些問題中任何一個你回答是,那麼你應該使用Quartz排程器。

  旁註:Matrix目前就大量使用到了Quartz。比如,排名統計功能的實現,在Jmatrix裡通過Quartz定義了一個定時排程作業,在每天凌晨一點,作業開始工作,重新統計大家的Karma和排名等。還有,RSS檔案的生成,也是通過Quartz定義作業,每隔半個小時生成一次RSS XML檔案。



二、為什麼研發團隊會選擇quartz
  1. java編寫的開源作業排程框架設計,用於J2SE和J2EE應用方便整合。
  2. 資歷夠老,創立於1998年,比struts1還早,而且一直在更新(24 Sept 2013: Quartz 2.2.1 Released),文件齊全。
  3. 設計清晰簡單:核心概念scheduler,trigger,job,jobDetail,listener,calendar 
  4. 支援叢集:org.quartz.jobStore.isClustered  最重要的一點原因是quartz是支援叢集的。不然JDK自帶Timer就可以實現相同的功能。
  5. 支援任務恢復:requestsRecovery 
  6. 普及面很廣,JAVA開發人員比較熟悉。
  7. Apache2.0開源協議,允許程式碼修改,再商業釋出。

三、quartz叢集

    關於quartz叢集網上文章介紹很多,拿一張常見的圖來說明。
   
  • Quartz叢集中的每個節點是一個獨立的Quartz應用,它又管理其它的節點。
  • 需要分別對每個節點分別啟動或停止。不像應用伺服器的叢集,獨立的Quartz節點並不與另一個節點或是管理節點通訊。
  • Quartz應用是通過資料庫表來感知到另一應用。
  • Quartz應用定時15秒同步一次心跳到資料庫。
  • Quartz通過資料庫行鎖來解決分散式環境下資料一致性問題。

    
Quartz官網: http://quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-11

問題:由於Quartz的叢集基於對錶進行行鎖,Quartz內部的DB操作大量Trigger存在嚴重競爭問題,瞬間大量trigger執行。

答:目前只能通過(org.quartz.jobStore.tablePrefix = QRTZ)分表操作,存在長時間lock_wait(新版本據說有提高)。Quartz2.x已經支援可選節點執行job,需要測試Spring最新版本是否支援Quartz的整合。

關於鎖的機制,後續文章會對quartz原始碼進行分析。


四、如何使定時任務的開發方便,易於管理。

阿里開源專案easySchedule在quartz叢集的基礎上搭建了一個簡單的管理平臺。解決了視覺化、易配置、統一監控告警功能。
實現排程與執行的分離,使任務不需要再去關注定時,只需要實現任務介面即可。
排程通過HTTP來呼叫執行任務。



easySchedule系統特點:

1、 Server和Client分別支援叢集和分散式部署

2、 任務的執行與排程分離

3、 視覺化管理所有任務

4、 任務狀態持久化於DB

5、 完善的日誌跟蹤和告警策略

6、 任務支援非同步排程

7、 靈活支援各種自定義任務,擴充套件方便