1.簡介
1.1概述
XXL-JOB是一個輕量級分布式任務調(diào)度框架,其核心設計目標是開發(fā)迅速嘶伟、學習簡單系忙、輕量級、易拓展蓄拣。代碼開源,目前已接入多家公司線上產(chǎn)品努隙,比較典型的有大眾點評球恤,優(yōu)信二手車,一加手機等剃法。
1.2特性
簡單:支持通過Web頁面對任務進行CRUD操作碎捺,操作簡單路鹰;
動態(tài):支持動態(tài)修改任務狀態(tài)贷洲、暫停/恢復任務,以及終止運行中任務晋柱,即時生效优构;
調(diào)度中心HA:調(diào)度采用中心式設計,“調(diào)度中心”基于集群Quartz實現(xiàn)雁竞,可保證調(diào)度中心HA钦椭;
執(zhí)行器HA(分布式):任務分布式執(zhí)行,任務“執(zhí)行器”支持集群部署碑诉,可保證任務執(zhí)行HA彪腔;
任務Failover:執(zhí)行器集群部署時,任務路由策略選擇“故障轉(zhuǎn)移”情況下調(diào)度失敗時將會平滑切換執(zhí)行器進行Failover进栽;
一致性:“調(diào)度中心”通過DB鎖保證集群分布式調(diào)度的一致性德挣,一次任務調(diào)度只會觸發(fā)一次執(zhí)行;
自定義任務參數(shù):支持在線配置調(diào)度任務入?yún)⒖烀磿r生效格嗅;
調(diào)度線程池:調(diào)度系統(tǒng)多線程觸發(fā)調(diào)度運行,確保調(diào)度精確執(zhí)行唠帝,不被堵塞屯掖;
彈性擴容縮容:一旦有新執(zhí)行器上線或者下線,下次調(diào)度時將會重新分配任務襟衰;
郵件報警:任務失敗時支持郵件報警贴铜,支持配置多郵件地址群發(fā)報警郵件;
狀態(tài)監(jiān)控:支持實時監(jiān)控任務進度瀑晒;
Rolling執(zhí)行日志:支持在線查看調(diào)度結果绍坝,并且支持以Rolling方式實時查看執(zhí)行器輸出的完整的執(zhí)行日志;
GLUE:提供Web IDE瑰妄,支持在線開發(fā)任務邏輯代碼陷嘴,動態(tài)發(fā)布,實時編譯生效间坐,省略部署上線的過程灾挨。支持30個版本的歷史版本回溯邑退;
數(shù)據(jù)加密:調(diào)度中心和執(zhí)行器之間的通訊進行數(shù)據(jù)加密,提升調(diào)度信息安全性劳澄;
任務依賴:支持配置子任務依賴地技,當父任務執(zhí)行結束且執(zhí)行成功后將會主動觸發(fā)一次子任務的執(zhí)行,多個子任務用逗號分隔秒拔;
推送maven中央倉庫:將會把最新穩(wěn)定版推送到maven中央倉庫莫矗,方便用戶接入和使用;
任務注冊:執(zhí)行器會周期性自動注冊任務砂缩,調(diào)度中心將會自動發(fā)現(xiàn)注冊的任務并觸發(fā)執(zhí)行作谚。同時,也支持手動錄入執(zhí)行器地址庵芭;
路由策略:執(zhí)行器集群部署時提供豐富的路由策略妹懒,包括:第一個、最后一個双吆、輪詢眨唬、隨機、一致性Hash好乐、最不經(jīng)常使用匾竿、最近最久未使用、故障轉(zhuǎn)移蔚万、忙碌轉(zhuǎn)移等岭妖;
1.3下載
源碼倉庫地址
https://github.com/xuxueli/xxl-jobDownload
中央倉庫地址
2.項目實踐
2.1初始化“調(diào)度數(shù)據(jù)庫”
數(shù)據(jù)庫環(huán)境:Mysql5.6+
初始化SQL腳本tables_xxl_job.sql,正常情況下應該生成16張表笛坦。
調(diào)度中心支持集群部署区转,集群情況下各節(jié)點務必連接同一個Mysql示例
導入源碼
xxl-job-admin:調(diào)度中心
xxl-job-executor:執(zhí)行器
xxl-job-executor-sample-springboot:Springboot版本,通過Springboot管理執(zhí)行器
2.2部署“調(diào)度中心”
調(diào)度中心配置:/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
配置內(nèi)容說明:
>>>>>郵箱地址無效需自行配置
>>>>>dispatchertask為數(shù)據(jù)庫名稱
部署項目
正確配置后版扩,將項目編譯打包(war)部署在tomcat(/webapps目錄下)废离,修改tomcat配置文件,如下礁芦,即代表調(diào)度中心部署成功蜻韭。
調(diào)度中心訪問地址http://localhost:8080/xxl-job-admin,登錄后運行界面如下圖所示
3.部署執(zhí)行器項目
3.1配置文件和配置類
確認pom文件引入了xxl-job-core的maven依賴柿扣,添加執(zhí)行器配置:
Addresses:調(diào)度中心部署根地址肖方,執(zhí)行器將會使用該地址進行執(zhí)行器心跳注冊和任務結果回調(diào)
Appname:執(zhí)行器心跳注冊分組依據(jù),即同一個集群下的執(zhí)行器appname必須一致
Ip:默認為空表示自動獲取IP未状,也可以手動設置
Port:執(zhí)行器默認端口9999俯画,集群下的執(zhí)行器要配置不同的端口
AccessToken:執(zhí)行器通訊Token,非空時啟用司草,進行數(shù)據(jù)加密
注:日志基于logback艰垂,logback的使用請另找出處泡仗。
Config配置
3.2執(zhí)行器集群
執(zhí)行器支持集群部署,提升調(diào)度系統(tǒng)可用性猜憎,同時提升任務處理能力
集群部署唯一要求為:保證集群中每個執(zhí)行器的配置項“調(diào)度中心地址”保持一致娩怎,執(zhí)行器根據(jù)配置進行執(zhí)行器自動注冊等操作。
調(diào)度中心添加執(zhí)行器
AppName:執(zhí)行器配置中的Appname值胰柑,執(zhí)行器會周期性以AppName為對象進行自動注冊截亦。
名稱:執(zhí)行器名稱,因為AppName限制字母數(shù)字等組成柬讨,可讀性不強崩瓤,名稱為了提高執(zhí)行器的可讀性
排序:執(zhí)行器的排序,新增任務時姐浮,將會按照該排序讀取可用的執(zhí)行器列表
注冊方式:調(diào)度中心獲取執(zhí)行器地址的方式谷遂;
自動注冊:執(zhí)行器自動進行執(zhí)行器注冊,調(diào)度中心通過底層注冊表可以動態(tài)發(fā)現(xiàn)執(zhí)行器地址
手動錄入:人工手動錄入執(zhí)行器的地址信息卖鲤,多地址逗號分隔,供調(diào)度中心使用
機器地址:“注冊方式”為手動錄入時有效畴嘶,支持人工維護執(zhí)行器的地址信息蛋逾。
3.4新建任務
想要完成什么樣的功能,必須由開發(fā)者手動編寫實現(xiàn)窗悯,以“獲取所有航司數(shù)據(jù)”為例:
>>>>execute方法實現(xiàn)自己要執(zhí)行的任務
運行執(zhí)行器之后区匣,即可在調(diào)度中心新增任務
執(zhí)行器:任務的綁定的執(zhí)行器,任務觸發(fā)調(diào)度時將會自動發(fā)現(xiàn)注冊成功的執(zhí)行器
描述:任務的描述信息蒋院,便于任務管理
路由策略:當執(zhí)行器集群部署時亏钩,提供豐富的路由策略,包括欺旧,
第一個:固定選擇第一個機器姑丑;
最后一個:固定選擇最后一個機器;
輪詢:執(zhí)行器循環(huán)執(zhí)行
隨機:隨機選擇在線的機器
一致性HASH:每個任務按照Hash算法固定選擇某一臺機器辞友,且所有任務均勻散列在不同機器上
最不經(jīng)常使用:使用頻率最低的機器優(yōu)先被選舉
最近最久未使用:輪詢的倒序選用
故障轉(zhuǎn)移:按照順序依次進行心跳檢測栅哀,第一個心跳檢測成功的機器選定為目標執(zhí)行器并發(fā)起調(diào)度
忙碌轉(zhuǎn)移:按照順序依次進行空閑檢測,第一個空閑檢測成功的機器選定為目標執(zhí)行器并發(fā)起調(diào)度
Cron:觸發(fā)任務執(zhí)行的Cron表達式
運行模式:
模式:任務以JobHandler方式維護在執(zhí)行器端称龙,需要結合“JobHandler”屬性匹配執(zhí)行器中任務
JobHandler:運行模式為“Bean”時生效留拾,對應執(zhí)行器中新開發(fā)的JobHandler類@JobHandler注解自定義的value值
子任務Key:每個任務都擁有一個唯一的任務Key(任務Key可以從任務列表獲取)鲫尊,當本任務執(zhí)行結束并且執(zhí)行成功時痴柔,將會觸發(fā)子任務Key所對應的任務的一次主動調(diào)度。
阻塞處理策略:調(diào)度過于密集執(zhí)行器來不及處理時的處理策略疫向,
單機串行:調(diào)度請求進入單機執(zhí)行器后咳蔚,調(diào)度請求進入FIFO隊列并以串行方式運行扛施;
丟棄后續(xù)調(diào)度:調(diào)度請求進入單機執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運行的調(diào)度任務屹篓,本次請求將會將丟棄并標記為失敻碓;
覆蓋之前調(diào)度:調(diào)度請求進入單機執(zhí)行器后堆巧,發(fā)現(xiàn)執(zhí)行器存在運行的調(diào)度任務妄荔,將會終止運行中的調(diào)度任務并清空隊列,然后運行本地調(diào)度任務
失敗處理策略:
失敗告警:調(diào)度失敗時谍肤,將會觸發(fā)失敗報警啦租,如發(fā)送報警郵件;
失敗重試:調(diào)度失敗時荒揣,將會主動進行一次失敗重試調(diào)度篷角,重試調(diào)度后仍然失敗將會觸發(fā)失敗告警。注意當任務以failover方式路由時系任,每次失敗重試將會觸發(fā)新一輪路由恳蹲;
執(zhí)行參數(shù):任務執(zhí)行所需的參數(shù),多個參數(shù)時用逗號分隔俩滥,任務執(zhí)行時將會把多個參數(shù)轉(zhuǎn)換為數(shù)組傳入
報警郵件:任務調(diào)度失敗時郵件通知的郵箱地址嘉蕾,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔
3.5Cron表達式詳細用法
Cron表達式的格式
{秒數(shù)}{分鐘}{小數(shù)}{日期}{月份}{星期}{年份{可為空}}? ? ??
| 字段 | 允許值 | 允許的特殊字符 |
| --------? | -----:? | :----: |
| 秒? ? ? ? | 0-59? ? |? , - * /? ? |
| 分? ? ? ? | 0-59? ? ? |? , - * /? |
| 小時? ? ? ? | 0-23? ? ? |? , - * /? |
| 日期? ? ? ? | 1-31? ? |? , - * ? / L W C? |
| 月份? ? ? | 1-12或者JAN-DEC? ? |? , - * /? |
| 星期? ? ? ? | 1-12或者JAN-DEC? ? |? , - * ? / L W C #? |
| 年? ? ? ? | 1970-2099? ? |? , - * /? |
秒
允許值范圍:0~59霜旧,不允許為空值
“*”代表每隔1秒鐘觸發(fā)
“,”代表在指定的秒數(shù)觸發(fā)错忱,比如”0,15,45”代表0秒、15秒和45秒觸發(fā)
“-”代表在指定的范圍內(nèi)觸發(fā)挂据,比如”25-45”代表從25秒開始觸發(fā)到45秒結束觸發(fā)以清,每隔1秒觸發(fā)一次
“/”代表觸發(fā)步進,”/”前面的值代表初始值("*”等同”0”),后面的值代表偏移量崎逃,比如”0/20”或者”*/20”代表從0秒開始掷倔,每隔20秒觸發(fā)一次
特殊字符
“*”
“*”字符被用來指定所有的值。如:"*"在分鐘的字段域里表示“每分鐘”婚脱。
“?”
“?”字符只在日期域和星期域中使用今魔。它被用來指定“非明確的值”。當你需要通過在這兩個域中的一個來指定一些東西的時候障贸,它是有用的错森。
“-”
“-”字符被用來指定一個范圍。如:“10-12”在小時域意味著“10點篮洁、11點涩维、12點”。
“,”
“,”字符被用來指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一瓦阐、星期三蜗侈、星期五”。
“/”
“/”字符用于指定增量睡蟋。如:“0/15”在秒域意思是每分鐘的0踏幻,15,30和45秒戳杀「妹妫“5/15”在分鐘域表示每小時的5,20信卡,35和50隔缀。符號“*”在“/”前面(如:*/10)等價于0在“/”前面(如:0/10)。記住一條本質(zhì):表達式的每個數(shù)值域都是一個有最大值和最小值的集合傍菇,如:秒域和分鐘域的集合是0-59猾瘸,日期域是1-31,月份域是1-12丢习。字符“/”可以幫助你在每個字符域中取相應的數(shù)值牵触。如:“7/6”在月份域的時候只有當7月的時候才會觸發(fā),并不是表示每個6月泛领。
“W”
字符“W”只允許日期域出現(xiàn)荒吏。這個字符用于指定日期的最近工作日。例如:如果你在日期域中寫“15W”渊鞋,表示:這個月15號最近的工作日。所以瞧挤,如果15號是周六锡宋,則任務會在14號觸發(fā)。如果15號是周日特恬,則任務會在周一也就是16號觸發(fā)执俩。
“#”
字符“#”只允許在星期域中出現(xiàn)。這個字符用于指定本月的某某天癌刽。例如:“6#3”表示本月第三周的星期五(6表示星期五役首,3表示第三周)。
“C”
字符“C”允許在日期域和星期域出現(xiàn)显拜。這個字符依靠一個指定的“日歷”衡奥。也就是說這個表達式的值依賴于相關的“日歷”的計算結果,如果沒有“日歷”關聯(lián)远荠,則等價于所有包含的“日歷”矮固。如:日期域是“5C”表示關聯(lián)“日歷”中第一天,或者這個月開始的第一天的后5天譬淳。星期域是“1C”表示關聯(lián)“日歷”中第一天档址,或者星期的第一天的后1天盹兢,也就是周日的后一天(周一)。