xxl-job
簡述
XXL-JOB是一個輕量級的分布式任務排程平台,基于quartz實作,它修改了任務排程的模式,并且任務排程采用注冊+RPC的方式實作。
架構圖

xxl-job特性
簡單:支援通過Web頁面對任務進行CRUD操作,操作簡單,一分鐘上手
動态:支援動态修改任務狀态、啟動/停止任務,以及終止運作中任務,即時生效
排程中心HA(中心式):排程采用中心式設計,“排程中心”基于叢集Quartz實作,支援叢集部署,可保證排程中心HA(高可用)
執行器HA(分布式):任務分布式執行,任務"執行器"支援叢集部署,可保證任務執行HA
注冊中心: 執行器會周期性自動注冊任務, 排程中心将會自動發現注冊的任務并觸發執行。同時,也支援手動錄入執行器位址
彈性擴容縮容:一旦有新執行器機器上線或者下線,下次排程時将會重新配置設定任務
路由政策:執行器叢集部署時提供豐富的路由政策,包括:第一個、最後一個、輪詢、随機、一緻性HASH、最不經常使用、最近最久未使用、故障轉移、忙碌轉移等
故障轉移:任務路由政策選擇"故障轉移"情況下,如果執行器叢集中某一台機器故障,将會自動故障轉移切換到另一台正常的執行器發送排程請求。
阻塞處理政策:排程過于密集,執行器來不及處理時的處理政策,政策包括:單機串行(預設)、丢棄後續排程、覆寫之前排程
任務逾時控制:支援自定義任務逾時時間,任務運作逾時将會主動中斷任務
任務失敗重試:支援自定義任務失敗重試次數,當任務失敗時将會按照預設的失敗重試次數主動進行重試;其中分片任務支援分片粒度的失敗重試
任務失敗告警;預設提供郵件方式失敗告警,同時預留擴充的其它方式的接口,比如短信、釘釘等告警方式
分片廣播任務:執行器叢集部署時,任務路由政策選擇"分片廣播"情況下,一次任務排程将會廣播觸發叢集中所有執行器都執行一次任務,可根據分片參數開發分片任務
動态分片:分片廣播任務以執行器為次元進行分片,分片到各個執行器,支援動态擴容執行器叢集進而動态增加分片數量,協同進行業務處理;在進行大資料量業務操作時可顯著提升任務處理能力和速度
事件觸發:除了"Cron方式"和"任務依賴方式"觸發任務執行之外,支援基于事件的觸發任務方式。排程中心提供觸發任務單次執行的API服務,可根據業務事件靈活觸發
任務進度監控:支援實時監控任務進度
Rolling實時日志:支援線上檢視排程結果,并且支援以Rolling方式實時檢視執行器輸出的完整的執行日志
GLUE:提供Web IDE,支援線上開發任務邏輯代碼,動态釋出,實時編譯生效,省略部署上線的過程。支援30個版本的曆史版本回溯
腳本任務:支援以GLUE模式開發和運作腳本任務,包括Shell、Python、NodeJS、PHP、PowerShell等類型的腳本
指令行任務:原生提供通用指令行任務Handler(Bean任務,"CommandJobHandler");業務方隻需要提供指令行即可
任務依賴:支援配置子任務依賴,當父任務執行結束且執行成功後将會主動觸發一次子任務的執行, 多個子任務用逗号分隔
一緻性:“排程中心”通過DB鎖保證叢集分布式排程的一緻性, 一次任務排程隻會觸發一次執行
自定義任務參數:支援線上配置排程任務入參(請求參數),即時生效
排程線程池:排程系統多線程觸發排程運作,確定排程精确執行,不被阻塞
資料加密:排程中心和執行器之間的通訊進行資料加密,提升排程資訊安全性
郵件報警:任務失敗時支援郵件報警,支援配置多郵件位址群發報警郵件
推送maven中央倉庫: 将會把最新穩定版推送到maven中央倉庫, 友善使用者接入和使用
運作報表:支援實時檢視運作資料,如任務數量、排程次數、執行器數量等;以及排程報表,如排程日期分布圖,排程成功分布圖等
全異步:任務排程流程全異步化設計實作,如異步排程、異步運作、異步回調等,有效對密集排程進行流量削峰,理論上支援任意時長任務的運作
跨平台:原生提供通用HTTP任務Handler(Bean任務,"HttpJobHandler"),業務方隻需要提供HTTP連結即可,不限制語言、平台
國際化:排程中心支援國際化設定,提供中文、英文兩種可選語言,預設為中文
容器化:提供官方docker鏡像,并實時更新推送dockerhub,進一步實作産品開箱即用
線程池隔離:排程線程池進行隔離拆分,慢任務自動降級進入"Slow"線程池,避免耗盡排程線程,提高系統穩定性
工作原理
- 任務執行器根據配置的排程中心的位址,自動注冊到排程中心
- 達到任務觸發條件,排程中心下發任務
- 執行器基于線程池執行任務,并把執行結果放入記憶體隊列中、把執行日志寫入日志檔案中
- 執行器的回調線程消費記憶體隊列中的執行結果,主動上報給排程中心
- 當使用者在排程中心檢視任務日志,排程中心請求日志服務,讀取任務日志檔案并傳回日志詳情
源碼下載下傳
解壓源碼,idea打開源碼工程,源碼結構如下:
xxl-job-admin:排程中心
xxl-job-core:公共依賴
xxl-job-executor-samples:執行器Sample示例(選擇合适的版本執行器,可直接使用,也可以參考其并将現有項目改造成執行器)
xxl-job-executor-sample-springboot:Springboot版本,通過Springboot管理執行器,推薦這種方式;
xxl-job-executor-sample-spring:Spring版本,通過Spring容器管理執行器,比較通用;
xxl-job-executor-sample-frameless:無架構版本;
xxl-job-executor-sample-jfinal:JFinal版本,通過JFinal管理執行器;
xxl-job-executor-sample-nutz:Nutz版本,通過Nutz管理執行器;
問題1:
>>>>>>>>>>>觸發排程<<<<<<<<<<<
觸發排程:
address:192.168.158.107:9002
code:500
msg:xxl-rpc remoting error(no protocol: 192.168.158.107:9002/run), for url : 192.168.158.107:9002/run
原因:xxl-job版本問題,如果實際工作的xxl-job版本是2.2.2,而調用端依賴的xxl-job版本是2.2.1,前後版本不一緻,會出現xxl-rpc調用問題(版本不相容)。
解決:xxl-job調用的一方和提供服務的一方版本保持一緻。
問題2:
xxl-job 2.2.2中出現空指針異常
在super.start()方法後增加代碼:
//延遲1s
Thread.sleep(1000);
注意:xxl-job 2.2.2 隻能在方法上使用@XxlJob;xxl-job 2.2.1 隻能在類上使用@JobHandler,且需要實作IJobHandler抽象類。相同的是,注解中的value屬性值需要和web管理界面的JobHandler對應。
預設賬号
admin/123456