分佈式任務調度平臺XXL-JOB

1、簡介

1.1 概述

XXL-JOB是一個輕量級分佈式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼並接入多家公司線上產品線,開箱即用。php

1.2 特性

  • 一、簡單:支持經過Web頁面對任務進行CRUD操做,操做簡單,一分鐘上手;
  • 二、動態:支持動態修改任務狀態、啓動/中止任務,以及終止運行中任務,即時生效;
  • 三、調度中心HA(中心式):調度採用中心式設計,「調度中心」基於集羣Quartz實現並支持集羣部署,可保證調度中心HA;
  • 四、執行器HA(分佈式):任務分佈式執行,任務"執行器"支持集羣部署,可保證任務執行HA;
  • 五、註冊中心: 執行器會週期性自動註冊任務, 調度中心將會自動發現註冊的任務並觸發執行。同時,也支持手動錄入執行器地址;
  • 六、彈性擴容縮容:一旦有新執行器機器上線或者下線,下次調度時將會從新分配任務;
  • 七、路由策略:執行器集羣部署時提供豐富的路由策略,包括:第一個、最後一個、輪詢、隨機、一致性HASH、最不常用、最近最久未使用、故障轉移、忙碌轉移等;
  • 八、故障轉移:任務路由策略選擇"故障轉移"狀況下,若是執行器集羣中某一臺機器故障,將會自動Failover切換到一臺正常的執行器發送調度請求。
  • 九、阻塞處理策略:調度過於密集執行器來不及處理時的處理策略,策略包括:單機串行(默認)、丟棄後續調度、覆蓋以前調度;
  • 十、任務超時控制:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
  • 十一、任務失敗重試:支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;其中分片任務支持分片粒度的失敗重試;
  • 十二、任務失敗告警;默認提供郵件方式失敗告警,同時預留擴展接口,可方面的擴展短信、釘釘等告警方式;
  • 1三、分片廣播任務:執行器集羣部署時,任務路由策略選擇"分片廣播"狀況下,一次任務調度將會廣播觸發集羣中全部執行器執行一次任務,可根據分片參數開發分片任務;
  • 1四、動態分片:分片廣播任務以執行器爲維度進行分片,支持動態擴容執行器集羣從而動態增長分片數量,協同進行業務處理;在進行大數據量業務操做時可顯著提高任務處理能力和速度。
  • 1五、事件觸發:除了"Cron方式"和"任務依賴方式"觸發任務執行以外,支持基於事件的觸發任務方式。調度中心提供觸發任務單次執行的API服務,可根據業務事件靈活觸發。
  • 1六、任務進度監控:支持實時監控任務進度;
  • 1七、Rolling實時日誌:支持在線查看調度結果,而且支持以Rolling方式實時查看執行器輸出的完整的執行日誌;
  • 1八、GLUE:提供Web IDE,支持在線開發任務邏輯代碼,動態發佈,實時編譯生效,省略部署上線的過程。支持30個版本的歷史版本回溯。
  • 1九、腳本任務:支持以GLUE模式開發和運行腳本任務,包括Shell、Python、NodeJS、PHP、PowerShell等類型腳本;
  • 20、命令行任務:原生提供通用命令行任務Handler(Bean任務,"CommandJobHandler");業務方只須要提供命令行便可;
  • 2一、任務依賴:支持配置子任務依賴,當父任務執行結束且執行成功後將會主動觸發一次子任務的執行, 多個子任務用逗號分隔;
  • 2二、一致性:「調度中心」經過DB鎖保證集羣分佈式調度的一致性, 一次任務調度只會觸發一次執行;
  • 2三、自定義任務參數:支持在線配置調度任務入參,即時生效;
  • 2四、調度線程池:調度系統多線程觸發調度運行,確保調度精確執行,不被堵塞;
  • 2五、數據加密:調度中心和執行器之間的通信進行數據加密,提高調度信息安全性;
  • 2六、郵件報警:任務失敗時支持郵件報警,支持配置多郵件地址羣發報警郵件;
  • 2七、推送maven中央倉庫: 將會把最新穩定版推送到maven中央倉庫, 方便用戶接入和使用;
  • 2八、運行報表:支持實時查看運行數據,如任務數量、調度次數、執行器數量等;以及調度報表,如調度日期分佈圖,調度成功分佈圖等;
  • 2九、全異步:任務調度流程全異步化設計實現,如異步調度、異步運行、異步回調等,有效對密集調度進行流量削峯,理論上支持任意時長任務的運行;
  • 30、跨平臺:原生提供通用HTTP任務Handler(Bean任務,"HttpJobHandler");業務方只須要提供HTTP連接便可,不限制語言、平臺;
  • 3一、國際化:調度中心支持國際化設置,提供中文、英文兩種可選語言,默認爲中文;
  • 3二、容器化:提供官方docker鏡像,並實時更新推送dockerhub,進一步實現產品開箱即用;

1.3 發展

於2015年中,我在github上建立XXL-JOB項目倉庫並提交第一個commit,隨之進行系統結構設計,UI選型,交互設計……html

於2015-11月,XXL-JOB終於RELEASE了第一個大版本V1.0, 隨後我將之發佈到OSCHINA,XXL-JOB在OSCHINA上得到了@紅薯的熱門推薦,同期分別達到了OSCHINA的「熱門動彈」排行第一和git.oschina的開源軟件月熱度排行第一,在此特別感謝紅薯,感謝你們的關注和支持。java

於2015-12月,我將XXL-JOB發表到我司內部知識庫,而且獲得內部同事承認。node

於2016-01月,我司展開XXL-JOB的內部接入和定製工做,在此感謝袁某和尹某兩位同事的貢獻,同時也感謝內部其餘給與關注與支持的同事。python

於2017-05-13,在上海舉辦的 "第62期開源中國源創會" 的 "放碼過來" 環節,我登臺對XXL-JOB作了演講,臺下五百位在場觀衆反響熱烈(圖文回顧 )。mysql

於2017-10-22,又拍雲 Open Talk 聯合 Spring Cloud 中國社區舉辦的 "進擊的微服務實戰派上海站",我登臺對XXL-JOB作了演講,現場觀衆反響熱烈並在會後與XXL-JOB用戶熱烈討論交流。nginx

於2017-12-11,XXL-JOB有幸參會《InfoQ ArchSummit全球架構師峯會》,並被拍拍貸架構總監"楊波老師"在專題 "微服務原理、基礎架構和開源實踐" 中現場介紹。git

於2017-12-18,XXL-JOB參與"2017年度最受歡迎中國開源軟件"評比,在當時已錄入的約九千個國產開源項目中角逐,最終進入了前30強。github

於2018-01-15,XXL-JOB參與"2017碼雲最火開源項目"評比,在當時已錄入的約六千五百個碼雲項目中角逐,最終進去了前20強。ajax

於2018-04-14,iTechPlus在上海舉辦的 "2018互聯網開發者大會",我登臺對XXL-JOB作了演講,現場觀衆反響熱烈並在會後與XXL-JOB用戶熱烈討論交流。

於2018-05-27,在上海舉辦的 "第75期開源中國源創會" 的 "架構" 主題專場,我登臺進行「基礎架構與中間件圖譜」主題演講,臺下上千位在場觀衆反響熱烈(圖文回顧 )。

我司大衆點評目前已接入XXL-JOB,內部別名《Ferrari》(Ferrari基於XXL-JOB的V1.1版本定製而成,新接入應用推薦升級最新版本)。 據最新統計, 自2016-01-21接入至2017-12-01期間,該系統已調度約100萬次,表現優異。新接入應用推薦使用最新版本,由於通過數十個版本的更新,系統的任務模型、UI交互模型以及底層調度通信模型都有了較大的優化和提高,核心功能更加穩定高效。

至今,XXL-JOB已接入多家公司的線上產品線,接入場景如電商業務,O2O業務和大數據做業等,截止最新統計時間爲止,XXL-JOB已接入的公司包括不限於:

- 一、大衆點評;
- 二、山東學而網絡科技有限公司;
- 三、安徽慧通互聯科技有限公司;
- 四、人人聚財金服;
- 五、上海棠棣信息科技股份有限公司
- 六、運滿滿
- 七、米其林 (中國區)
- 八、媽媽聯盟
- 九、九櫻天下(北京)信息技術有限公司
- 十、萬普拉斯科技有限公司(一加手機)
- 十一、上海億保健康管理有限公司
- 十二、海爾馨廚 (海爾)
- 1三、河南大紅包電子商務有限公司
- 1四、成都順點科技有限公司
- 1五、深圳市怡亞通
- 1六、深圳麥亞信科技股份有限公司
- 1七、上海博瑩科技信息技術有限公司
- 1八、中國平安科技有限公司
- 1九、杭州知時信息科技有限公司
- 20、博瑩科技(上海)有限公司
- 2一、成都依能股份有限責任公司
- 2二、湖南高陽通聯信息技術有限公司
- 2三、深圳市邦德文化發展有限公司
- 2四、福建阿思可網絡教育有限公司
- 2五、優信二手車
- 2六、上海悠遊堂投資發展股份有限公司
- 2七、北京粉筆藍天科技有限公司
- 2八、中秀科技(無錫)有限公司
- 2九、武漢空心科技有限公司
- 30、北京螞蟻風暴科技有限公司
- 3一、四川互宜達科技有限公司
- 3二、錢包行雲(北京)科技有限公司
- 3三、重慶欣才集團
- 3四、咪咕互動娛樂有限公司(中國移動)
- 3五、北京諾亦騰科技有限公司
- 3六、增加引擎(北京)信息技術有限公司
- 3七、北京英貝思科技有限公司
- 3八、剛泰集團
- 3九、深圳泰久信息系統股份有限公司
- 40、隨行付支付有限公司
- 4一、廣州瀚農網絡科技有限公司
- 4二、享點科技有限公司
- 4三、杭州比智科技有限公司
- 4四、圳臨界線網絡科技有限公司
- 4五、廣州知識圈網絡科技有限公司
- 4六、國譽商業上海有限公司
- 4七、海爾消費金融有限公司,嗨付、夠花 (海爾)
- 4八、廣州巴圖魯信息科技有限公司
- 4九、深圳市鵬海運電子數據交換有限公司
- 50、深圳市亞飛電子商務有限公司
- 5一、上海趣醫網絡有限公司
- 5二、聚金資本
- 5三、北京父母邦網絡科技有限公司
- 5四、中山元赫軟件科技有限公司
- 5五、中商惠民(北京)電子商務有限公司
- 5六、凱京集團
- 5七、華夏票聯(北京)科技有限公司
- 5八、拍拍貸
- 5九、北京尚德機構在線教育有限公司
- 60、任子行股份有限公司
- 6一、北京時態電子商務有限公司
- 6二、深圳卷皮網絡科技有限公司
- 6三、北京安博通科技股份有限公司
- 6四、將來無線網
- 6五、廈門瓷禧網絡有限公司
- 6六、北京遞藍科軟件股份有限公司
- 6七、鄭州創海軟件科技公司
- 6八、北京國槐信息科技有限公司
- 6九、浪潮軟件集團
- 70、多立恆(北京)信息技術有限公司
- 7一、廣州極迅客信息科技有限公司
- 7二、赫基(中國)集團股份有限公司
- 7三、海投匯
- 7四、上海潤益創業孵化器管理股份有限公司
- 7五、漢納森(廈門)數據股份有限公司
- 7六、安信信託
- 7七、嵐儒財富
- 7八、捷道軟件
- 7九、湖北享七網絡科技有限公司
- 80、湖南創發科技責任有限公司
- 8一、深圳小安時代互聯網金融服務有限公司
- 8二、湖北享七網絡科技有限公司
- 8三、錢包行雲(北京)科技有限公司
- 8四、360金融 (360)
- 8五、易企秀
- 8六、摩貝(上海)生物科技有限公司
- 8七、廣東芯智慧科技有限公司
- 8八、聯想集團 (聯想)
- 8九、怪獸充電
- 90、行圓汽車
- 9一、深圳店店通科技郵箱公司
- 9二、京東 (京東)
- 9三、米莊理財
- 9四、咖啡易融
- 9五、梧桐誠選
- 9六、恆大地產 (恆大)
- 9七、昆明龍慧
- 9八、上海澀瑤軟件
- 9九、易信 (網易)
- 100、銅板街
- 10一、杭州雲若網絡科技有限公司
- 10二、特百惠(中國)有限公司
- 10三、常山衆卡運力供應鏈管理有限公司
- 10四、深圳立創電子商務有限公司
- 10五、杭州智諾科技股份有限公司
- 10六、北京雲漾信息科技有限公司
- 10七、深圳市多銀科技有限公司
- 10八、親寶寶
- 10九、上海博卡軟件科技有限公司
- 1十、智慧樹在線教育平臺
- 1十一、米族金融
- 1十二、北京辰森世紀
- 11三、雲南滇醫通
- 11四、廣州市分領網絡科技有限責任公司
- 11五、浙江微能科技有限公司
- 11六、上海馨飛電子商務有限公司
- 11七、上海寶尊電子商務有限公司
- 11八、直客通科技技術有限公司
- 11九、科度科技有限公司
- 120、上海數慧系統技術有限公司
- 12一、個人醫藥網
- 12二、多粉平臺
- 12三、鐵甲二手機
- 12四、上海海新得數據技術有限公司
- 12五、深圳市珍愛網信息技術有限公司 (珍愛網)
- 12六、小蜜蜂
- 12七、吉榮數科技
- 12八、上海愷域信息科技有限公司
- 12九、廣州荔支網絡有限公司(荔枝FM)
- 130、杭州閃寶科技有限公司
- 13一、北京互聯新網科技發展有限公司
- 13二、譽道科技
- 13三、山西兆盛房地產開發有限公司
- ……

更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。

歡迎你們的關注和使用,XXL-JOB也將擁抱變化,持續發展。

1.4 下載

文檔地址

源碼倉庫地址

源碼倉庫地址 Release Download
https://github.com/xuxueli/xxl-job Download
http://gitee.com/xuxueli0323/xxl-job Download

中央倉庫地址

<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>${最新穩定版本}</version>
</dependency>

技術交流

1.5 環境

  • JDK:1.7+
  • Servlet/JSP Spec:3.1/2.3
  • Tomcat:8.5.x/Jetty9.2.x
  • Spring-boot:1.5.x/Spring4.x
  • Mysql:5.6+
  • Maven:3+

2、快速入門

2.1 初始化「調度數據庫」

請下載項目源碼並解壓,獲取 "調度數據庫初始化SQL腳本" 並執行便可,正常狀況下應該生成16張表。

"調度數據庫初始化SQL腳本" 位置爲:

/xxl-job/doc/db/tables_xxl_job.sql

調度中心支持集羣部署,集羣狀況下各節點務必鏈接同一個mysql實例;

若是mysql作主從,調度中心集羣節點務必強制走主庫;

2.2 編譯源碼

解壓源碼,按照maven格式將源碼導入IDE, 使用maven進行編譯便可,源碼結構以下:

xxl-job-admin:調度中心
xxl-job-core:公共依賴
xxl-job-executor:執行器Sample示例(選擇合適的版本執行器,可直接使用,也能夠參考其並將現有項目改形成執行器)
    :xxl-job-executor-sample-spring:Spring版本,經過Spring容器管理執行器,比較通用,推薦這種方式;
    :xxl-job-executor-sample-springboot:Springboot版本,經過Springboot管理執行器;
    :xxl-job-executor-sample-jfinal:JFinal版本,經過JFinal管理執行器;
    :xxl-job-executor-sample-nutz:Nutz版本,經過Nutz管理執行器;

2.3 配置部署「調度中心」

調度中心項目:xxl-job-admin
做用:統一管理任務調度平臺上調度任務,負責觸發調度執行,而且提供任務管理平臺。

步驟一:調度中心配置:

調度中心配置文件地址:

/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties

調度中心配置內容說明:

### 調度中心JDBC連接:連接地址請保持和 2.1章節 所建立的調度數據庫的地址一致
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

### 報警郵箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

### 登陸帳號
xxl.job.login.username=admin
xxl.job.login.password=123456

### 調度中心通信TOKEN,非空時啓用
xxl.job.accessToken=

### 調度中心國際化設置,默認爲中文版本,值設置爲「en」時切換爲英文版本
xxl.job.i18n=

步驟二:部署項目:

若是已經正確進行上述配置,可將項目編譯打包部署。 調度中心訪問地址:http://localhost:8080/xxl-job-admin (該地址執行器將會使用到,做爲回調地址),登陸後運行界面以下圖所示

輸入圖片說明

至此「調度中心」項目已經部署成功。

步驟三:調度中心集羣(可選):

調度中心支持集羣部署,提高調度系統容災和可用性。

調度中心集羣部署時,幾點要求和建議:

  • DB配置保持一致;
  • 登錄帳號配置保持一致;
  • 集羣機器時鐘保持一致(單機集羣忽視);
  • 建議:推薦經過nginx爲調度中心集羣作負載均衡,分配域名。調度中心訪問、執行器回調配置、調用API服務等操做均經過該域名進行。

其餘:Docker 鏡像方式搭建調度中心:

  • 下載鏡像
// Docker地址:https://hub.docker.com/r/xuxueli/xxl-job-admin/
docker pull xuxueli/xxl-job-admin
  • 建立容器並運行
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin

/**
* 如需自定義 mysql 等配置,可經過 "PARAMS" 指定;
* 配置項參考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin

2.4 配置部署「執行器項目」

「執行器」項目:xxl-job-executor-sample-spring (提供多種版本執行器供選擇,現以Spring版本爲例,可直接使用,也能夠參考其並將現有項目改形成執行器)
做用:負責接收「調度中心」的調度並執行;可直接部署執行器,也能夠將執行器集成到現有業務項目中。

步驟一:maven依賴

確認pom文件中引入了 "xxl-job-core" 的maven依賴;

步驟二:執行器配置

執行器配置,配置文件地址:

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties

執行器配置,配置內容說明:

### xxl-job admin address list:調度中心部署跟地址:如調度中心集羣部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回調"。
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### xxl-job executor address:執行器"AppName"和地址信息配置:AppName執行器心跳註冊分組依據;地址信息用於"調度中心請求並觸發任務"和"執行器註冊"。執行器默認端口爲9999,執行器IP默認爲空表示自動獲取IP,多網卡時可手動設置指定IP,該IP不會綁定Host僅做爲通信實用。單機部署多個執行器時,注意要配置不一樣執行器端口;
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=
xxl.job.executor.port=9999

### xxl-job, access token:執行器通信TOKEN,非空時啓用
xxl.job.accessToken=
    
### xxl-job log path:執行器運行日誌文件存儲的磁盤位置,須要對該路徑擁有讀寫權限
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/

### xxl-job log retention days:執行器Log文件按期清理功能,指定日誌保存天數,日誌文件過時自動刪除。限制至少保持3天,不然功能不生效;
xxl.job.executor.logretentiondays=-1

步驟三:執行器組件配置

執行器組件,配置文件地址:

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml

執行器組件,配置內容說明:

<!-- 配置0一、JobHandler 掃描路徑:自動掃描容器中JobHandler -->
<context:component-scan base-package="com.xxl.job.executor.service.jobhandler" />

<!-- 配置0二、執行器 -->
<bean id="xxlJobExecutor" class="com.xxl.job.core.executor.XxlJobExecutor" init-method="start" destroy-method="destroy" >
    <!-- 執行器註冊中心地址[選填],爲空則關閉自動註冊 -->
    <property name="adminAddresses" value="${xxl.job.admin.addresses}" />
    <!-- 執行器AppName[選填],爲空則關閉自動註冊 -->
    <property name="appName" value="${xxl.job.executor.appname}" />
    <!-- 執行器IP[選填],爲空則自動獲取 -->
    <property name="ip" value="${xxl.job.executor.ip}" />
    <!-- 執行器端口號[選填],小於等於0則自動獲取 -->
    <property name="port" value="${xxl.job.executor.port}" />
    <!-- 訪問令牌[選填],非空則進行匹配校驗 -->
    <property name="accessToken" value="${xxl.job.accessToken}" />
    <!-- 執行器日誌路徑[選填],爲空則使用默認路徑 -->
    <property name="logPath" value="${xxl.job.executor.logpath}" />
    <!-- 日誌保存天數[選填],值大於3時生效 -->
    <property name="logRetentionDays" value="${xxl.job.executor.logretentiondays}" />
</bean>

步驟四:部署執行器項目:

若是已經正確進行上述配置,可將執行器項目編譯打部署,系統提供多種執行器Sample示例項目,選擇其中一個便可,各自的部署方式以下。

xxl-job-executor-sample-springboot:項目編譯打包成springboot類型的可執行JAR包,命令啓動便可;
xxl-job-executor-sample-spring:項目編譯打包成WAR包,並部署到tomcat中。
xxl-job-executor-sample-jfinal:同上
xxl-job-executor-sample-nutz:同上

至此「執行器」項目已經部署結束。

步驟五:執行器集羣(可選):

執行器支持集羣部署,提高調度系統可用性,同時提高任務處理能力。

執行器集羣部署時,幾點要求和建議:

  • 執行器回調地址(xxl.job.admin.addresses)須要保持一致;執行器根據該配置進行執行器自動註冊等操做。
  • 同一個執行器集羣內AppName(xxl.job.executor.appname)須要保持一致;調度中心根據該配置動態發現不一樣集羣的在線執行器列表。

2.5 開發第一個任務「Hello World」

本示例以新建一個 「GLUE模式(Java)」 運行模式的任務爲例。更多有關任務的詳細配置,請查看「章節三:任務詳解」。 ( 「GLUE模式(Java)」的執行代碼託管到調度中心在線維護,相比「Bean模式任務」須要在執行器項目開發部署上線,更加簡便輕量)

前提:請確認「調度中心」和「執行器」項目已經成功部署並啓動;

步驟一:新建任務:

登陸調度中心,點擊下圖所示「新建任務」按鈕,新建示例任務。而後,參考下面截圖中任務的參數配置,點擊保存。

輸入圖片說明

輸入圖片說明

步驟二:「GLUE模式(Java)」 任務開發:

請點擊任務右側 「GLUE」 按鈕,進入 「GLUE編輯器開發界面」 ,見下圖。「GLUE模式(Java)」 運行模式的任務默認已經初始化了示例任務代碼,即打印Hello World。 ( 「GLUE模式(Java)」 運行模式的任務其實是一段繼承自IJobHandler的Java類代碼,它在執行器項目中運行,可以使用@Resource/@Autowire注入執行器裏中的其餘服務,詳細介紹請查看第三章節)

輸入圖片說明

輸入圖片說明

步驟三:觸發執行:

請點擊任務右側 「執行」 按鈕,可手動觸發一次任務執行(一般狀況下,經過配置Cron表達式進行任務調度出發)。

步驟四:查看日誌:

請點擊任務右側 「日誌」 按鈕,可前往任務日誌界面查看任務日誌。 在任務日誌界面中,可查看該任務的歷史調度記錄以及每一次調度的任務調度信息、執行參數和執行信息。運行中的任務點擊右側的「執行日誌」按鈕,可進入日誌控制檯查看實時執行日誌。

輸入圖片說明

在日誌控制檯,能夠Rolling方式實時查看任務在執行器一側運行輸出的日誌信息,實時監控任務進度;

輸入圖片說明

3、任務詳解

配置屬性詳細說明:

- 執行器:任務的綁定的執行器,任務觸發調度時將會自動發現註冊成功的執行器, 實現任務自動發現功能; 另外一方面也能夠方便的進行任務分組。每一個任務必須綁定一個執行器, 可在 "執行器管理" 進行設置;
- 任務描述:任務的描述信息,便於任務管理;
- 路由策略:當執行器集羣部署時,提供豐富的路由策略,包括;
    FIRST(第一個):固定選擇第一個機器;
    LAST(最後一個):固定選擇最後一個機器;
    ROUND(輪詢):;
    RANDOM(隨機):隨機選擇在線的機器;
    CONSISTENT_HASH(一致性HASH):每一個任務按照Hash算法固定選擇某一臺機器,且全部任務均勻散列在不一樣機器上。
    LEAST_FREQUENTLY_USED(最不常用):使用頻率最低的機器優先被選舉;
    LEAST_RECENTLY_USED(最近最久未使用):最久爲使用的機器優先被選舉;
    FAILOVER(故障轉移):按照順序依次進行心跳檢測,第一個心跳檢測成功的機器選定爲目標執行器併發起調度;
    BUSYOVER(忙碌轉移):按照順序依次進行空閒檢測,第一個空閒檢測成功的機器選定爲目標執行器併發起調度;
    SHARDING_BROADCAST(分片廣播):廣播觸發對應集羣中全部機器執行一次任務,同時系統自動傳遞分片參數;可根據分片參數開發分片任務;
    
- Cron:觸發任務執行的Cron表達式;
- 運行模式:
    BEAN模式:任務以JobHandler方式維護在執行器端;須要結合 "JobHandler" 屬性匹配執行器中任務;
    GLUE模式(Java):任務以源碼方式維護在調度中心;該模式的任務其實是一段繼承自IJobHandler的Java類代碼並 "groovy" 源碼方式維護,它在執行器項目中運行,可以使用@Resource/@Autowire注入執行器裏中的其餘服務;
    GLUE模式(Shell):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "shell" 腳本;
    GLUE模式(Python):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "python" 腳本;
    GLUE模式(PHP):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "php" 腳本;
    GLUE模式(NodeJS):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "nodejs" 腳本;
    GLUE模式(PowerShell):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "PowerShell" 腳本;
- JobHandler:運行模式爲 "BEAN模式" 時生效,對應執行器中新開發的JobHandler類「@JobHandler」註解自定義的value值;
- 阻塞處理策略:調度過於密集執行器來不及處理時的處理策略;
    單機串行(默認):調度請求進入單機執行器後,調度請求進入FIFO隊列並以串行方式運行;
    丟棄後續調度:調度請求進入單機執行器後,發現執行器存在運行的調度任務,本次請求將會被丟棄並標記爲失敗;
    覆蓋以前調度:調度請求進入單機執行器後,發現執行器存在運行的調度任務,將會終止運行中的調度任務並清空隊列,而後運行本地調度任務;
- 子任務:每一個任務都擁有一個惟一的任務ID(任務ID能夠從任務列表獲取),當本任務執行結束而且執行成功時,將會觸發子任務ID所對應的任務的一次主動調度。
- 任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
- 失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
- 報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;
- 負責人:任務的負責人;
- 執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;

3.1 BEAN模式

任務邏輯以JobHandler的形式存在於「執行器」所在項目中,開發流程以下:

步驟一:執行器項目中,開發JobHandler:

 - 一、繼承"IJobHandler":「com.xxl.job.core.handler.IJobHandler」;
 - 二、註冊到Spring容器:添加「@Component」註解,被Spring容器掃描爲Bean實例;
 - 三、註冊到執行器工廠:添加「@JobHandler(value="自定義jobhandler名稱")」註解,註解value值對應的是調度中心新建任務的JobHandler屬性的值。
 - 四、執行日誌:須要經過 "XxlJobLogger.log" 打印執行日誌;
(可參考Sample示例執行器中的DemoJobHandler,見下圖)

輸入圖片說明

步驟二:調度中心,新建調度任務

參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "BEAN模式",JobHandler屬性填寫任務註解「@JobHandler」中定義的值;

輸入圖片說明

原生內置Bean模式任務

爲方便用戶參考與快速實用,示例執行器內原生提供多個Bean模式任務Handler,能夠直接配置實用,以下:

  • demoJobHandler:簡單示例任務,任務內部模擬耗時任務邏輯,用戶可在線體驗Rolling Log等功能;
  • shardingJobHandler:分片示例任務,任務內部模擬處理分片參數,可參考熟悉分片任務;
  • httpJobHandler:通用HTTP任務Handler;業務方只須要提供HTTP連接便可,不限制語言、平臺;
  • commandJobHandler:通用命令行任務Handler;業務方只須要提供命令行便可;如 「pwd」命令;

3.2 GLUE模式(Java)

任務以源碼方式維護在調度中心,支持經過Web IDE在線更新,實時編譯和生效,所以不須要指定JobHandler。開發流程以下:

步驟一:調度中心,新建調度任務:

參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "GLUE模式(Java)";

輸入圖片說明

步驟二:開發任務代碼:

選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(也能夠在IDE中開發完成後,複製粘貼到編輯中)。

版本回溯功能(支持30個版本的版本回溯):在GLUE任務的Web IDE界面,選擇右上角下拉框「版本回溯」,會列出該GLUE的更新歷史,選擇相應版本便可顯示該版本代碼,保存後GLUE代碼即回退到對應的歷史版本;

輸入圖片說明

3.3 GLUE模式(Shell)

步驟一:調度中心,新建調度任務

參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "GLUE模式(Shell)";

步驟二:開發任務代碼:

選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(也能夠在IDE中開發完成後,複製粘貼到編輯中)。

該模式的任務其實是一段 "shell" 腳本;

輸入圖片說明

3.4 GLUE模式(Python)

步驟一:調度中心,新建調度任務

參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "GLUE模式(Python)";

步驟二:開發任務代碼:

選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(也能夠在IDE中開發完成後,複製粘貼到編輯中)。

該模式的任務其實是一段 "python" 腳本;

輸入圖片說明

3.5 GLUE模式(NodeJS)

步驟一:調度中心,新建調度任務

參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "GLUE模式(NodeJS)";

步驟二:開發任務代碼:

選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(也能夠在IDE中開發完成後,複製粘貼到編輯中)。

該模式的任務其實是一段 "nodejS" 腳本;

3.6 GLUE模式(PHP)

同上

3.7 GLUE模式(PowerShell)

同上

4、任務管理

4.0 配置執行器

點擊進入"執行器管理"界面, 以下圖: 輸入圖片說明

一、"調度中心OnLine:"右側顯示在線的"調度中心"列表, 任務執行結束後, 將會以failover的模式進行回調調度中心通知執行結果, 避免回調的單點風險;
二、"執行器列表" 中顯示在線的執行器列表, 可經過"OnLine 機器"查看對應執行器的集羣機器。

點擊按鈕 "+新增執行器" 彈框以下圖, 可新增執行器配置:

輸入圖片說明

執行器屬性說明

AppName: 是每一個執行器集羣的惟一標示AppName, 執行器會週期性以AppName爲對象進行自動註冊。可經過該配置自動發現註冊成功的執行器, 供任務調度時使用;
名稱: 執行器的名稱, 由於AppName限制字母數字等組成,可讀性不強, 名稱爲了提升執行器的可讀性;
排序: 執行器的排序, 系統中須要執行器的地方,如任務新增, 將會按照該排序讀取可用的執行器列表;
註冊方式:調度中心獲取執行器地址的方式;
    自動註冊:執行器自動進行執行器註冊,調度中心經過底層註冊表能夠動態發現執行器機器地址;
    手動錄入:人工手動錄入執行器的地址信息,多地址逗號分隔,供調度中心使用;
機器地址:"註冊方式"爲"手動錄入"時有效,支持人工維護執行器的地址信息;

4.1 新建任務

進入任務管理界面,點擊「新增任務」按鈕,在彈出的「新增任務」界面配置任務屬性後保存便可。詳情頁參考章節 "3、任務詳解"。

4.2 編輯任務

進入任務管理界面,選中指定任務。點擊該任務右側「編輯」按鈕,在彈出的「編輯任務」界面更新任務屬性後保存便可,能夠修改設置的任務屬性信息:

4.3 編輯GLUE代碼

該操做僅針對GLUE任務。

選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發。可參考章節 "3.2 GLUE模式(Java)"。

4.4 啓動/中止任務

可對任務進行「啓動」和「中止」操做。 須要注意的是,此處的啓動/中止僅針對任務的後續調度觸發行爲,不會影響到已經觸發的調度任務,如需終止已經觸發的調度任務,可查看「4.8 終止運行中的任務」

輸入圖片說明

4.5 手動觸發一次調度

點擊「執行」按鈕,可手動觸發一次任務調度,不影響原有調度規則。

輸入圖片說明

4.6 查看調度日誌

點擊「日誌」按鈕,能夠查看任務歷史調度日誌。在歷史調入日誌界面可查看每次任務調度的調度結果、執行結果等,點擊「執行日誌」按鈕可查看執行器完整日誌。

輸入圖片說明

輸入圖片說明

調度時間:"調度中心"觸發本次調度並向"執行器"發送任務執行信號的時間;
調度結果:"調度中心"觸發本次調度的結果,200表示成功,500或其餘表示失敗;
調度備註:"調度中心"觸發本次調度的日誌信息;
執行器地址:本次任務執行的機器地址
運行模式:觸發調度時任務的運行模式,運行模式可參考章節 "3、任務詳解";
任務參數:本地任務執行的入參
執行時間:"執行器"中本次任務執行結束後回調的時間;
執行結果:"執行器"中本次任務執行的結果,200表示成功,500或其餘表示失敗;
執行備註:"執行器"中本次任務執行的日誌信息;
操做:
    "執行日誌"按鈕:點擊可查看本地任務執行的詳細日誌信息;詳見「4.7 查看執行日誌」;
    "終止任務"按鈕:點擊可終止本地調度對應執行器上本任務的執行線程,包括未執行的阻塞任務一併被終止;

4.7 查看執行日誌

點擊執行日誌右側的 「執行日誌」 按鈕,可跳轉至執行日誌界面,能夠查看業務代碼中打印的完整日誌,以下圖;

輸入圖片說明

4.8 終止運行中的任務

僅針對執行中的任務。 在任務日誌界面,點擊右側的「終止任務」按鈕,將會向本次任務對應的執行器發送任務終止請求,將會終止掉本次任務,同時會清空掉整個任務執行隊列。

輸入圖片說明

任務終止時經過 "interrupt" 執行線程的方式實現, 將會觸發 "InterruptedException" 異常。所以若是JobHandler內部catch到了該異常並消化掉的話, 任務終止功能將不可用。

所以, 若是遇到上述任務終止不可用的狀況, 須要在JobHandler中應該針對 "InterruptedException" 異常進行特殊處理 (向上拋出) , 正確邏輯以下:

try{
    // TODO
} catch (Exception e) {
    if (e instanceof InterruptedException) {
        throw e;
    }
    logger.warn("{}", e);
}

並且,在JobHandler中開啓子線程時,子線程也不可catch處理"InterruptedException",應該主動向上拋出。

4.9 刪除執行日誌

在任務日誌界面,選中執行器和任務以後,點擊右側的"刪除"按鈕將會出現"日誌清理"彈框,彈框中支持選擇不一樣類型的日誌清理策略,選中後點擊"肯定"按鈕便可進行日誌清理操做; 輸入圖片說明

輸入圖片說明

4.10 刪除任務

點擊刪除按鈕,能夠刪除對應任務。

輸入圖片說明

5、整體設計

5.1 源碼目錄介紹

- /doc :文檔資料
- /db :「調度數據庫」建表腳本
- /xxl-job-admin :調度中心,項目源碼
- /xxl-job-core :公共Jar依賴
- /xxl-job-executor-samples :執行器,Sample示例項目(你們能夠在該項目上進行開發,也能夠將現有項目改造生成執行器項目)

5.2 「調度數據庫」配置

XXL-JOB調度模塊基於Quartz集羣實現,其「調度數據庫」是在Quartz的11張集羣mysql表基礎上擴展而成。

XXL-JOB首先定製了Quartz原生表結構前綴(XXL_JOB_QRTZ_)。

而後,在此基礎上新增了幾張張擴展表,以下: - XXL_JOB_QRTZ_TRIGGER_GROUP:執行器信息表,維護任務執行器信息; - XXL_JOB_QRTZ_TRIGGER_REGISTRY:執行器註冊表,維護在線的執行器和調度中心機器地址信息; - XXL_JOB_QRTZ_TRIGGER_INFO:調度擴展信息表: 用於保存XXL-JOB調度任務的擴展信息,如任務分組、任務名、機器地址、執行器、執行入參和報警郵件等等; - XXL_JOB_QRTZ_TRIGGER_LOG:調度日誌表: 用於保存XXL-JOB任務調度的歷史信息,如調度結果、執行結果、調度入參、調度機器和執行器等等; - XXL_JOB_QRTZ_TRIGGER_LOGGLUE:任務GLUE日誌:用於保存GLUE更新歷史,用於支持GLUE的版本回溯功能;

所以,XXL-JOB調度數據庫共計用於16張數據庫表。

5.3 架構設計

5.3.1 設計思想

將調度行爲抽象造成「調度中心」公共平臺,而平臺自身並不承擔業務邏輯,「調度中心」負責發起調度請求。

將任務抽象成分散的JobHandler,交由「執行器」統一管理,「執行器」負責接收調度請求並執行對應的JobHandler中業務邏輯。

所以,「調度」和「任務」兩部分能夠相互解耦,提升系統總體穩定性和擴展性;

5.3.2 系統組成

  • 調度模塊(調度中心): 負責管理調度信息,按照調度配置發出調度請求,自身不承擔業務代碼。調度系統與任務解耦,提升了系統可用性和穩定性,同時調度系統性能再也不受限於任務模塊; 支持可視化、簡單且動態的管理調度信息,包括任務新建,更新,刪除,GLUE開發和任務報警等,全部上述操做都會實時生效,同時支持監控調度結果以及執行日誌,支持執行器Failover。
  • 執行模塊(執行器): 負責接收調度請求並執行任務邏輯。任務模塊專一於任務的執行等操做,開發和維護更加簡單和高效; 接收「調度中心」的執行請求、終止請求和日誌請求等。

5.3.3 架構圖

輸入圖片說明

5.4 調度模塊剖析

5.4.1 quartz的不足

Quartz做爲開源做業調度中的佼佼者,是做業調度的首選。可是集羣環境中Quartz採用API的方式對任務進行管理,從而能夠避免上述問題,可是一樣存在如下問題:

  • 問題一:調用API的的方式操做任務,不人性化;
  • 問題二:須要持久化業務QuartzJobBean到底層數據表中,系統侵入性至關嚴重。
  • 問題三:調度邏輯和QuartzJobBean耦合在同一個項目中,這將致使一個問題,在調度任務數量逐漸增多,同時調度任務邏輯逐漸加劇的狀況加,此時調度系統的性能將大大受限於業務;
  • 問題四:quartz底層以「搶佔式」獲取DB鎖並由搶佔成功節點負責運行任務,會致使節點負載懸殊很是大;而XXL-JOB經過執行器實現「協同分配式」運行任務,充分發揮集羣優點,負載各節點均衡。

XXL-JOB彌補了quartz的上述不足之處。

5.4.2 RemoteHttpJobBean

常規Quartz的開發,任務邏輯通常維護在QuartzJobBean中,耦合很嚴重。XXL-JOB中「調度模塊」和「任務模塊」徹底解耦,調度模塊中的全部調度任務使用同一個QuartzJobBean,即RemoteHttpJobBean。不一樣的調度任務將各自參數維護在各自擴展表數據中,當觸發RemoteHttpJobBean執行時,將會解析不一樣的任務參數發起遠程調用,調用各自的遠程執行器服務。

這種調用模型相似RPC調用,RemoteHttpJobBean提供調用代理的功能,而執行器提供遠程服務的功能。

5.4.3 調度中心HA(集羣)

基於Quartz的集羣方案,數據庫選用Mysql;集羣分佈式併發環境中使用QUARTZ定時任務調度,會在各個節點會上報任務,存到數據庫中,執行時會從數據庫中取出觸發器來執行,若是觸發器的名稱和執行時間相同,則只有一個節點去執行此任務。

# for cluster
org.quartz.jobStore.tablePrefix = XXL_JOB_QRTZ_
org.quartz.scheduler.instanceId: AUTO
org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.isClustered: true
org.quartz.jobStore.clusterCheckinInterval: 1000

5.4.4 調度線程池

調度採用線程池方式實現,避免單線程因阻塞而引發任務調度延遲。

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 50
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

5.4.5 @DisallowConcurrentExecution

XXL-JOB調度模塊的「調度中心」默認不使用該註解,即默認開啓並行機制,由於RemoteHttpJobBean爲公共QuartzJobBean,這樣在多線程調度的狀況下,調度模塊被阻塞的概率很低,大大提升了調度系統的承載量。

XXL-JOB的每一個調度任務雖然在調度模塊是並行調度執行的,可是任務調度傳遞到任務模塊的「執行器」確實串行執行的,同時支持任務終止。

5.4.6 misfire

錯過了觸發時間,處理規則。 可能緣由:服務重啓;調度線程被QuartzJobBean阻塞,線程被耗盡;某個任務啓用了@DisallowConcurrentExecution,上次調度持續阻塞,下次調度被錯過;

quartz.properties中關於misfire的閥值配置以下,單位毫秒:

org.quartz.jobStore.misfireThreshold: 60000

Misfire規則: withMisfireHandlingInstructionDoNothing:不觸發當即執行,等待下次調度; withMisfireHandlingInstructionIgnoreMisfires:以錯過的第一個頻率時間馬上開始執行; withMisfireHandlingInstructionFireAndProceed:以當前時間爲觸發頻率馬上觸發一次執行;

XXL-JOB默認misfire規則爲:withMisfireHandlingInstructionDoNothing

CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobInfo.getJobCron()).withMisfireHandlingInstructionDoNothing();
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();

5.4.7 日誌回調服務

調度模塊的「調度中心」做爲Web服務部署時,一方面承擔調度中心功能,另外一方面也爲執行器提供API服務。

調度中心提供的"日誌回調服務API服務"代碼位置以下:

xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback

「執行器」在接收到任務執行請求後,執行任務,在執行結束以後會將執行結果回調通知「調度中心」:

5.4.8 任務HA(Failover)

執行器如若集羣部署,調度中心將會感知到在線的全部執行器,如「127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999」。

當任務"路由策略"選擇"故障轉移(FAILOVER)"時,當調度中心每次發起調度請求時,會按照順序對執行器發出心跳檢測請求,第一個檢測爲存活狀態的執行器將會被選定併發送調度請求。

調度成功後,可在日誌監控界面查看「調度備註」,以下; 輸入圖片說明

「調度備註」能夠看出本地調度運行軌跡,執行器的"註冊方式"、"地址列表"和任務的"路由策略"。"故障轉移(FAILOVER)"路由策略下,調度中心首先對第一個地址進行心跳檢測,心跳失敗所以自動跳過,第二個依然心跳檢測失敗…… 直至心跳檢測第三個地址「127.0.0.1:9999」成功,選定爲「目標執行器」;而後對「目標執行器」發送調度請求,調度流程結束,等待執行器回調執行結果。

5.4.9 調度日誌

調度中心每次進行任務調度,都會記錄一條任務日誌,任務日誌主要包括如下三部份內容:

  • 任務信息:包括「執行器地址」、「JobHandler」和「執行參數」等屬性,點擊任務ID按鈕可查看,根據這些參數,能夠精確的定位任務執行的具體機器和任務代碼;
  • 調度信息:包括「調度時間」、「調度結果」和「調度日誌」等,根據這些參數,能夠了解「調度中心」發起調度請求時具體狀況。
  • 執行信息:包括「執行時間」、「執行結果」和「執行日誌」等,根據這些參數,能夠了解在「執行器」端任務執行的具體狀況;

調度日誌,針對單次調度,屬性說明以下:

  • 執行器地址:任務執行的機器地址;
  • JobHandler:Bean模式表示任務執行的JobHandler名稱;
  • 任務參數:任務執行的入參;
  • 調度時間:調度中心,發起調度的時間;
  • 調度結果:調度中心,發起調度的結果,SUCCESS或FAIL;
  • 調度備註:調度中心,發起調度的備註信息,如地址心跳檢測日誌等;
  • 執行時間:執行器,任務執行結束後回調的時間;
  • 執行結果:執行器,任務執行的結果,SUCCESS或FAIL;
  • 執行備註:執行器,任務執行的備註信息,如異常日誌等;
  • 執行日誌:任務執行過程當中,業務代碼中打印的完整執行日誌,見「4.7 查看執行日誌」;

5.4.10 任務依賴

原理:XXL-JOB中每一個任務都對應有一個任務ID,同時,每一個任務支持設置屬性「子任務ID」,所以,經過「任務ID」能夠匹配任務依賴關係。

當父任務執行結束而且執行成功時,將會根據「子任務ID」匹配子任務依賴,若是匹配到子任務,將會主動觸發一次子任務的執行。

在任務日誌界面,點擊任務的「執行備註」的「查看」按鈕,能夠看到匹配子任務以及觸發子任務執行的日誌信息,如無信息則表示未觸發子任務執行,可參考下圖。

輸入圖片說明

輸入圖片說明

5.4.11 全異步化 & 輕量級

  • 全異步化設計:XXL-JOB系統中業務邏輯在遠程執行器執行,觸發流程全異步化設計。相比直接在quartz的QuartzJobBean中執行業務邏輯,極大的下降了調度線程佔用時間;
    • 異步調度:調度中心每次任務觸發時僅發送一次調度請求,該調度請求首先推送「異步調度隊列」,而後異步推送給遠程執行器
    • 異步執行:執行器會將請求存入「異步執行隊列」而且當即響應調度中心,異步運行。
  • 輕量級設計:XXL-JOB調度中心中每一個JOB邏輯很是 「輕」,在全異步化的基礎上,單個JOB一次運行平均耗時基本在 "10ms" 以內(基本爲一次請求的網絡開銷);所以,能夠保證使用有限的線程支撐大量的JOB併發運行;

得益於上述兩點優化,理論上默認配置下的調度中心,單機可以支撐 5000 任務併發運行穩定運行;

實際場景中,因爲調度中心與執行器網絡ping延遲不一樣、DB讀寫耗時不一樣、任務調度密集程度不一樣,會致使任務量上限會上下波動。

如若須要支撐更多的任務量,能夠經過 "調大調度線程數" 、"下降調度中心與執行器ping延遲" 和 "提高機器配置" 幾種方式優化。

5.5 任務 "運行模式" 剖析

5.5.1 "Bean模式" 任務

開發步驟:可參考 "章節三" ; 原理:每一個Bean模式任務都是一個Spring的Bean類實例,它被維護在「執行器」項目的Spring容器中。任務類須要加「@JobHandler(value="名稱")」註解,由於「執行器」會根據該註解識別Spring容器中的任務。任務類須要繼承統一接口「IJobHandler」,任務邏輯在execute方法中開發,由於「執行器」在接收到調度中心的調度請求時,將會調用「IJobHandler」的execute方法,執行任務邏輯。

5.5.2 "GLUE模式(Java)" 任務

開發步驟:可參考 "章節三" ; 原理:每一個 "GLUE模式(Java)" 任務的代碼,其實是「一個繼承自「IJobHandler」的實現類的類代碼」,「執行器」接收到「調度中心」的調度請求時,會經過Groovy類加載器加載此代碼,實例化成Java對象,同時注入此代碼中聲明的Spring服務(請確保Glue代碼中的服務和類引用在「執行器」項目中存在),而後調用該對象的execute方法,執行任務邏輯。

5.5.3 GLUE模式(Shell) + GLUE模式(Python) + GLUE模式(NodeJS)

開發步驟:可參考 "章節三" ; 原理:腳本任務的源碼託管在調度中心,腳本邏輯在執行器運行。當觸發腳本任務時,執行器會加載腳本源碼在執行器機器上生成一份腳本文件,而後經過Java代碼調用該腳本;而且實時將腳本輸出日誌寫到任務日誌文件中,從而在調度中心能夠實時監控腳本運行狀況;

目前支持的腳本類型以下:

- shell腳本:任務運行模式選擇爲 "GLUE模式(Shell)"時支持 "shell" 腳本任務;
- python腳本:任務運行模式選擇爲 "GLUE模式(Python)"時支持 "python" 腳本任務;
- nodejs腳本:務運行模式選擇爲 "GLUE模式(NodeJS)"時支持 "nodejs" 腳本任務;

腳本任務經過 Exit Code 判斷任務執行結果,狀態碼可參考章節 "5.15 任務執行結果說明";

5.5.4 執行器

執行器其實是一個內嵌的Jetty服務器,默認端口9999(配置項:xxl.job.executor.port)。

在項目啓動時,執行器會經過「@JobHandler」識別Spring容器中「Bean模式任務」,以註解的value屬性爲key管理起來。

「執行器」接收到「調度中心」的調度請求時,若是任務類型爲「Bean模式」,將會匹配Spring容器中的「Bean模式任務」,而後調用其execute方法,執行任務邏輯。若是任務類型爲「GLUE模式」,將會加載GLue代碼,實例化Java對象,注入依賴的Spring服務(注意:Glue代碼中注入的Spring服務,必須存在與該「執行器」項目的Spring容器中),而後調用execute方法,執行任務邏輯。

5.5.5 任務日誌

XXL-JOB會爲每次調度請求生成一個單獨的日誌文件,須要經過 "XxlJobLogger.log" 打印執行日誌,「調度中心」查看執行日誌時將會加載對應的日誌文件。

(歷史版本經過重寫LOG4J的Appender實現,存在依賴限制,該方式在新版本已經被拋棄)

日誌文件存放的位置可在「執行器」配置文件進行自定義,默認目錄格式爲:/data/applogs/xxl-job/jobhandler/「格式化日期」/「數據庫調度日誌記錄的主鍵ID.log」。

在JobHandler中開啓子線程時,子線程將會將會把日誌打印在父線程即JobHandler的執行日誌中,方便日誌追蹤。

5.6 通信模塊剖析

5.6.1 一次完整的任務調度通信流程

- 一、「調度中心」向「執行器」發送http調度請求: 「執行器」中接收請求的服務,其實是一臺內嵌jetty服務器,默認端口9999;
- 二、「執行器」執行任務邏輯;
- 三、「執行器」http回調「調度中心」調度結果: 「調度中心」中接收回調的服務,是針對執行器開放一套API服務;

5.6.2 通信數據加密

調度中心向執行器發送的調度請求時使用RequestModel和ResponseModel兩個對象封裝調度請求參數和響應數據, 在進行通信以前底層會將上述兩個對象對象序列化,並進行數據協議以及時間戳檢驗,從而達到數據加密的功能;

5.7 任務註冊, 任務自動發現

自v1.5版本以後, 任務取消了"任務執行機器"屬性, 改成經過任務註冊和自動發現的方式, 動態獲取遠程執行器地址並執行。

AppName: 每一個執行器機器集羣的惟一標示, 任務註冊以 "執行器" 爲最小粒度進行註冊; 每一個任務經過其綁定的執行器可感知對應的執行器機器列表;
註冊表: 見"XXL_JOB_QRTZ_TRIGGER_REGISTRY"表, "執行器" 在進行任務註冊時將會週期性維護一條註冊記錄,即機器地址和AppName的綁定關係; "調度中心" 從而能夠動態感知每一個AppName在線的機器列表;
執行器註冊: 任務註冊Beat週期默認30s; 執行器以一倍Beat進行執行器註冊, 調度中心以一倍Beat進行動態任務發現; 註冊信息的失效時間被三倍Beat; 
執行器註冊摘除:執行器銷燬時,將會主動上報調度中心並摘除對應的執行器機器信息,提升心跳註冊的實時性;

爲保證系統"輕量級"而且下降學習部署成本,沒有采用Zookeeper做爲註冊中心,採用DB方式進行任務註冊發現;

5.8 任務執行結果

自v1.6.2以後,任務執行結果經過 "IJobHandler" 的返回值 "ReturnT" 進行判斷; 當返回值符合 "ReturnT.code == ReturnT.SUCCESS_CODE" 時表示任務執行成功,不然表示任務執行失敗,並且能夠經過 "ReturnT.msg" 回調錯誤信息給調度中心; 從而,在任務邏輯中能夠方便的控制任務執行結果;

5.9 分片廣播 & 動態分片

執行器集羣部署時,任務路由策略選擇"分片廣播"狀況下,一次任務調度將會廣播觸發對應集羣中全部執行器執行一次任務,同時系統自動傳遞分片參數;可根據分片參數開發分片任務;

"分片廣播" 以執行器爲維度進行分片,支持動態擴容執行器集羣從而動態增長分片數量,協同進行業務處理;在進行大數據量業務操做時可顯著提高任務處理能力和速度。

"分片廣播" 和普通任務開發流程一致,不一樣之處在於能夠能夠獲取分片參數,獲取分片參數進行分片業務處理。

  • Java語言任務獲取分片參數方式:BEAN、GLUE模式(Java)
// 可參考Sample示例執行器中的示例任務"ShardingJobHandler"瞭解試用 
ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
  • 腳本語言任務獲取分片參數方式:GLUE模式(Shell)、GLUE模式(Python)、GLUE模式(Nodejs)
// 腳本任務入參固定爲三個,依次爲:任務傳參、分片序號、分片總數。以Shell模式任務爲例,獲取分片參數代碼以下
echo "分片序號 index = $2"
echo "分片總數 total = $3"

分片參數屬性說明:

index:當前分片序號(從0開始),執行器集羣列表中當前執行器的序號;
total:總分片數,執行器集羣的總機器數量;

該特性適用場景如:

  • 一、分片任務場景:10個執行器的集羣來處理10w條數據,每臺機器只須要處理1w條數據,耗時下降10倍;
  • 二、廣播任務場景:廣播執行器機器運行shell腳本、廣播集羣節點進行緩存更新等

5.10 訪問令牌(AccessToken)

爲提高系統安全性,調度中心和執行器進行安全性校驗,雙方AccessToken匹配才容許通信;

調度中心和執行器,可經過配置項 "xxl.job.accessToken" 進行AccessToken的設置。

調度中心和執行器,若是須要正常通信,只有兩種設置;

  • 設置一:調度中心和執行器,均不設置AccessToken;關閉安全性校驗;
  • 設置二:調度中心和執行器,設置了相同的AccessToken;

5.11 調度中心API服務

調度中心提供了API服務,主要分爲兩種類型:

5.11.1 提供給執行器的API服務:

一、任務結果回調服務;
二、執行器註冊服務;
三、執行器註冊摘除服務;
四、觸發任務單次執行服務,支持任務根據業務事件觸發;

API服務位置:com.xxl.job.core.biz.AdminBiz.java
API服務請求參考代碼:com.xxl.job.adminbiz.AdminBizTest.java

5.11.2 提供給業務的API服務:

一、任務列表查詢;
二、任務新增;
三、任務更新;
四、任務刪除;
五、任務啓動;
六、任務中止;
七、任務觸發;

API服務位置:com.xxl.job.admin.controller.JobInfoController.java
API服務請求參考代碼:可參考任務界面操做的ajax請求。任何ajax接口都可配置成爲API服務,只需在待啓用的API服務上添加 「@PermessionLimit(limit = false)」 註解取消登錄態攔截便可;

5.12 執行器API服務

執行器提供了API服務,供調度中心選擇使用,目前提供的API服務有:

一、心跳檢測:調度中心使用
二、忙碌檢測:調度中心使用
三、觸發任務執行:調度中心使用;本地進行任務開發時,可以使用該API服務模擬觸發任務;
四、獲取Rolling Log:調度中心使用
五、終止任務:調度中心使用

API服務位置:com.xxl.job.core.biz.ExecutorBiz
API服務請求參考代碼:com.xxl.job.executor.ExecutorBizTest

5.13 故障轉移 & 失敗重試

一次完整任務流程包括"調度(調度中心) + 執行(執行器)"兩個階段。

  • "故障轉移"發生在調度階段,在執行器集羣部署時,若是某一臺執行器發生故障,該策略支持自動進行Failover切換到一臺正常的執行器機器而且完成調度請求流程。
  • "失敗重試"發生在"調度 + 執行"兩個階段,支持經過自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;

5.14 執行器灰度上線

調度中心與業務解耦,只需部署一次後常年不須要維護。可是,執行器中託管運行着業務做業,做業上線和變動須要重啓執行器,尤爲是Bean模式任務。 執行器重啓可能會中斷運行中的任務。可是,XXL-JOB得益於自建執行器與自建註冊中心,能夠經過灰度上線的方式,避免因重啓致使的任務中斷的問題。

步驟以下:

  • 一、執行器改成手動註冊,下線一半機器列表(A組),線上運行另外一半機器列表(B組);
  • 二、等待A組機器任務運行結束並編譯上線;執行器註冊地址替換爲A組;
  • 三、等待B組機器任務運行結束並編譯上線;執行器註冊地址替換爲A組+B組; 操做結束;

5.15 任務執行結果說明

系統根據如下標準判斷任務執行結果,可參考之。

-- Bean/Glue(Java) Glue(Shell) 等腳本任務
成功 IJobHandler.SUCCESS 0
失敗 IJobHandler.FAIL -1(非0狀態碼)

5.16 任務超時控制

支持設置任務超時時間,任務運行超時的狀況下,將會主動中斷任務;

須要注意的是,任務超時中斷時與任務終止機制(可查看「4.8 終止運行中的任務」)相似,也是經過 "interrupt" 中斷任務,所以業務代碼須要將 "InterruptedException" 外拋,不然功能不可用。

5.17 跨平臺 & 跨語言

跨平臺、跨語言主要體如今如下兩個方面:

  • 一、提供Java、Python、PHP……等十來種任務模式,可參考章節 「5.5 任務 "運行模式" 」;理論上可擴展任意語言任務模式;
  • 二、提供基於HTTP的任務Handler(Bean任務,JobHandler="HttpJobHandler");業務方只須要提供HTTP連接便可,不限制語言、平臺;

5.18 任務失敗告警

默認提供郵件失敗告警,可擴展短信、釘釘等方式,擴展代碼位置爲 "JobFailMonitorHelper.failAlarm";

5.19 調度中心Docker鏡像構建

能夠經過如下命令快速構建調度中心,並啓動運行;

mvn clean package
docker build -t xuxueli/xxl-job-admin ./xxl-job-admin
docker run --name xxl-job-admin -p 8080:8080 -d xuxueli/xxl-job-admin

5.20 避免任務重複執行

調度密集或者耗時任務可能會致使任務阻塞,集羣狀況下調度組件小几率狀況下會重複觸發; 針對上述狀況,能夠經過結合 "單機路由策略(如:第一臺、一致性哈希)" + "阻塞策略(如:單機串行、丟棄後續調度)" 來規避,最終避免任務重複執行。

5.21 命令行任務

原生提供通用命令行任務Handler(Bean任務,"CommandJobHandler");業務方只須要提供命令行便可; 如任務參數 "pwd" 將會執行命令並輸出數據;

6、版本更新日誌

6.1 版本 V1.1.x,新特性[2015-12-05]

【於V1.1.x版本,XXL-JOB正式應用於我司,內部定製別名爲 「Ferrari」,新接入應用推薦使用最新版本】

  • 一、簡單:支持經過Web頁面對任務進行CRUD操做,操做簡單,一分鐘上手;
  • 二、動態:支持動態修改任務狀態,動態暫停/恢復任務,即時生效;
  • 三、服務HA:任務信息持久化到mysql中,Job服務自然支持集羣,保證服務HA;
  • 四、任務HA:某臺Job服務掛掉,任務會平滑分配給其餘的某一臺存活服務,即便全部服務掛掉,重啓時或補償執行丟失任務;
  • 五、一個任務只會在其中一臺服務器上執行;
  • 六、任務串行執行;
  • 七、支持自定義參數;
  • 八、支持遠程任務執行終止;

6.2 版本 V1.2.x,新特性[2016-01-17]

  • 一、支持任務分組;

  • 二、支持「本地任務」、「遠程任務」;

  • 三、底層通信支持兩種方式,Servlet方式 + JETTY方式;

  • 四、支持「任務日誌」;

  • 五、支持「串行執行」,並行執行;

    說明:V1.2版本將系統架構按功能拆分爲:

      - 調度模塊(調度中心):負責管理調度信息,按照調度配置發出調度請求;
      - 執行模塊(執行器):負責接收調度請求並執行任務邏輯;
      - 通信模塊:負責調度模塊和任務模塊之間的信息通信;
    

    優勢:

      - 解耦:任務模塊提供任務接口,調度模塊維護調度信息,業務相互獨立;
      - 高擴展性;
      - 穩定性;
    

6.3 版本 V1.3.0,新特性[2016-05-19]

  • 一、遺棄「本地任務」模式,推薦使用「遠程任務」,易於系統解耦,任務對應的JobHandler統稱爲「執行器」;

  • 二、遺棄「servlet」方式底層系統通信,推薦使用JETTY方式,調度+回調雙向通信,重構通信邏輯;

  • 三、UI交互優化:左側菜單展開狀態優化,菜單項選中狀態優化,任務列表打開表格有壓縮優化;

  • 四、【重要】「執行器」細分爲:BEAN、GLUE兩種開發模式,簡介見下文:

    「執行器」 模式簡介: - BEAN模式執行器:每一個執行器都是Spring的一個Bean實例,XXL-JOB經過註解@JobHandler識別和調度執行器; -GLUE模式執行器:每一個執行器對應一段代碼,在線Web編輯和維護,動態編譯生效,執行器負責加載GLUE代碼和執行;

6.4 版本 V1.3.1,新特性[2016-05-23]

  • 一、更新項目目錄結構:
    • /xxl-job-admin -------------------- 【調度中心】:負責管理調度信息,按照調度配置發出調度請求;
    • /xxl-job-core ----------------------- 公共依賴
    • /xxl-job-executor-example ------ 【執行器】:負責接收調度請求並執行任務邏輯;
    • /db ---------------------------------- 建表腳本
    • /doc --------------------------------- 用戶手冊
  • 二、在新的目錄結構上,升級了用戶手冊;
  • 三、優化了一些交互和UI;

6.5 版本 V1.3.2,新特性[2016-05-28]

  • 一、調度邏輯進行事務包裹;
  • 二、執行器異步回調執行日誌;
  • 三、【重要】在 「調度中心」 支持HA的基礎上,擴展執行器的Failover支持,支持配置多執行期地址;

6.6 版本 V1.4.0 新特性[2016-07-24]

  • 一、任務依賴: 經過事件觸發方式實現, 任務執行成功並回調時會主動觸發一次子任務的調度, 多個子任務用逗號分隔;
  • 二、執行器底層實現代碼進行重度重構, 優化底層建表腳本;
  • 三、執行器中任務線程分組邏輯優化: 以前根據執行器JobHandler進行線程分組,當多個任務複用Jobhanlder會致使相互阻塞。現改成根據調度中心任務進行任務線程分組,任務與任務執行相互隔離;
  • 四、執行器調度通信方案優化, 經過Hex + HC實現建議RPC通信協議, 優化了通信參數的維護和解析流程;
  • 五、調度中心, 新建/編輯任務, 界面屬性調整:
    • 5.一、任務新增/編輯界面中去除 "任務名JobName"屬性 ,該屬性改成系統自動生成: 該字段以前主要用於在 "調度中心" 惟一標示一個任務, 現實意義不大, 所以計劃淡化掉該字段,改成系統生成UUID,從而簡化任務新建的操做;
    • 5.二、任務新增/編輯界面中去除 "GLUE模式" 複選框位置調整, 改成貼近"JobHandler"輸入框右側;
    • 5.三、任務新增/編輯界面中去除 "報警閾值" 屬性;
    • 5.四、任務新增/編輯界面中去除 "子任務Key" 屬性, 每一個任務全局任務Key能夠從任務列表獲取, 當本任務執行結束且成功後, 將會根據子任務Key匹配子任務並主動觸發一次子任務執行;
  • 六、問題修復:
    • 6.一、執行器jetty關閉優化,解決一處可能致使jetty沒法關閉的問題;
    • 6.二、執行器任務終止時,執行隊列回調優化,解決一處致使任務沒法回調的問題;
    • 6.三、調度中心中列表分頁參數優化,解決一處因服務器限制post長度而引發的問題;
    • 6.四、執行器Jobhandler註解優化,解決一處因事務代理致使的容器沒法加載JobHandler的問題;
    • 6.五、遠程調度優化,禁用retry策略,解決一處可能致使重複調用的問題;

Tips: 歷史版本(V1.3.x)目前已經Release至穩定版本, 進入維護階段, 地址見分支 V1.3 。新特性將會在master分支持續更新。

6.7 版本 V1.4.1 新特性[2016-09-06]

  • 一、項目成功推送maven中央倉庫, 中央倉庫地址以及依賴以下:
    <!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>${最新穩定版}</version>
    </dependency>
    
  • 二、爲適配中央倉庫規則, 項目groupId從com.xxl改成com.xuxueli。
  • 三、系統版本不在維護在項目跟pom中,各個子模塊單獨配置版本配置,解決子模塊沒法單獨編譯的問題;
  • 四、底層RPC通信,傳輸數據的字節長度統計規則優化,可節省50%數據傳輸量;
  • 五、IJobHandler取消任務返回值,原經過返回值判斷執行狀態,邏輯改成:默認任務執行成功,僅在捕獲異常時認定任務執行失敗。
  • 六、系統公共彈框功能,插件化;
  • 七、底層表結構,代表統一大寫;
  • 八、調度中心,異常處理器JSON響應的ContentType修改,修復瀏覽器不識別的問題;

6.8 版本 V1.4.2 新特性[2016-09-29]

  • 一、推送新版本 V1.4.2 至中央倉庫, 大版本 V1.4 進入維護階段;
  • 二、任務新增時,任務列表偏移問題修復;
  • 三、修復一處因bootstrap不支持模態框重疊而致使的樣式錯亂的問題, 在任務編輯時會出現該問題;
  • 四、調度超時和Handler匹配不到時,調度狀態優化;
  • 五、因catch異常,致使任務不可終止的問題,給出解決方案, 見文檔;

6.9 版本 V1.5.0 特性[2016-11-13]

  • 一、任務註冊: 執行器會週期性自動註冊任務, 調度中心將會自動發現註冊的任務並觸發執行。
  • 二、"執行器" 新增參數 "AppName" : 是每一個執行器集羣的惟一標示AppName, 並週期性以AppName爲對象進行自動註冊。
  • 三、調度中心新增欄目 "執行器管理" : 管理在線的執行器, 經過屬性AppName自動發現註冊的執行器。只有被管理的執行器才容許被使用;
  • 四、"任務組"屬性改成"執行器": 每一個任務須要綁定指定的執行器, 調度地址經過綁定的執行器獲取;
  • 五、拋棄"任務機器"屬性: 經過任務綁定的執行器, 自動發現註冊的遠程執行器地址並觸發調度請求。
  • 六、"公共依賴"中新增DBGlueLoader,基於原生jdbc實現GLUE源碼的加載器,減小第三方依賴(mybatis,spring-orm等);精簡和優化執行器測配置(針對GLUE任務),下降上手難度;
  • 七、表結構調整,底層重構優化;
  • 八、"調度中心"自動註冊和發現,failover: 調度中心週期性自動註冊, 任務回調時能夠感知在線的全部調度中心地址, 經過failover的方式進行任務回調,避免回調單點風險。

6.10 版本 V1.5.1 特性[2016-11-13]

  • 一、底層代碼重構和邏輯優化,POM清理以及CleanCode;
  • 二、Servlet/JSP Spec設定爲3.0/2.2
  • 三、Spring升級至3.2.17.RELEASE版本;
  • 四、Jetty升級版本至8.2.0.v20160908;
  • 五、已推送V1.5.0和V1.5.1至Maven中央倉庫;

6.10 版本 V1.5.2 特性[2017-02-28]

  • 一、IP工具類獲取IP邏輯優化,IP靜態緩存;
  • 二、執行器、調度中心,均支持自定義註冊IP地址;解決機器多網卡時錯誤網卡註冊的狀況;
  • 三、任務跨天執行時生成多份日誌文件的問題修復;
  • 四、底層日誌底層日誌調整,非敏感日誌level調整爲debug;
  • 五、升級數據庫鏈接池c3p0版本;
  • 六、執行器log4j配置優化,去除無效屬性;
  • 七、底層代碼重構和邏輯優化以及CleanCode;
  • 八、GLUE依賴注入邏輯優化,支持別名注入;

6.11 版本 V1.6.0 特性[2017-03-13]

  • 一、通信方案升級,原基於HEX的通信模型調整爲基於HTTP的B-RPC的通信模型;
  • 二、執行器支持手動設置執行地址列表,提供開關切換使用註冊地址仍是手動設置的地址;
  • 三、執行器路由規則:第一個、最後一個、輪詢、隨機、一致性HASH、最不常用、最近最久未使用、故障轉移;
  • 四、規範線程模型統一,統一線程銷燬方案(經過listener或stop方法,容器銷燬時銷燬線程;Daemon方式有時不太理想);
  • 五、規範系統配置數據,經過配置文件統一管理;
  • 六、CleanCode,清理無效的歷史參數;
  • 七、底層擴展數據結構以及相關表結構調整;
  • 八、新建任務默認爲非運行狀態;
  • 九、GLUE模式任務實例更新邏輯優化,原根據超時時間更新改成根據版本號更新,源碼變更版本號加一;

6.12 版本 V1.6.1 特性[2017-03-25]

  • 一、Rolling日誌;
  • 二、WebIDE交互重構;
  • 三、通信加強校驗,有效過濾非正常請求;
  • 四、權限加強校驗,採用動態登陸TOKEN(推薦接入內部SSO);
  • 五、數據庫配置優化,解決亂碼問題;

6.13 版本 V1.6.2 特性[2017-04-25]

  • 一、運行報表:支持實時查看運行數據,如任務數量、調度次數、執行器數量等;以及調度報表,如調度日期分佈圖,調度成功分佈圖等;
  • 二、JobHandler支持設置任務返回值,在任務邏輯中能夠方便的控制任務執行結果;
  • 三、資源路徑包含空格或中文時資源文件沒法加載時,沒法準確查看異常信息的問題處理。
  • 四、路由策越優化:循環和LFU路由策略計數器自增無上限問題和首次路由壓力集中在首臺機器的問題修復;

6.14 版本 V1.7.0 特性[2017-05-02]

  • 一、腳本任務:支持以GLUE模式開發和運行腳本任務,包括Shell、Python和Groovy等類型腳本;
  • 二、新增spring-boot類型執行器example項目;
  • 三、升級jetty版本至9.2;
  • 四、任務運行日誌移除log4j組件依賴,改成底層自主實現,從而取消了對日誌組件的依賴限制;
  • 五、執行器移除GlueLoader依賴,改成推送方式實現,從而GLUE源碼加載再也不依賴JDBC;
  • 六、登陸攔截Redirect時獲取項目名,解決非根據目錄發佈時跳轉404問題;

6.15 版本 V1.7.1 特性[2017-05-08]

  • 一、運行日誌讀寫編碼統一爲UTF-8,解決windows環境下日誌亂碼問題;
  • 二、通信超時時間限定爲10s,避免異常狀況下調度線程佔用;
  • 三、執行器,server啓動、銷燬和註冊邏輯調整;
  • 四、JettyServer關閉邏輯優化,修復執行器沒法正常關閉致使端口占用和頻繁打印c3p0日誌的問題;
  • 五、JobHandler中開啓子線程時,支持子線程輸出執行日誌並經過Rolling查看。
  • 六、任務日誌清理功能;
  • 七、彈框組件統一替換爲layer;
  • 八、升級quartz版本至2.3.0;

6.16 版本 V1.7.2 特性[2017-05-17]

  • 一、阻塞處理策略:調度過於密集執行器來不及處理時的處理策略,策略包括:單機串行(默認)、丟棄後續調度、覆蓋以前調度;
  • 二、失敗處理策略;調度失敗時的處理策略,策略包括:失敗告警(默認)、失敗重試;
  • 三、通信時間戳超時時間調整爲180s;
  • 四、執行器與數據庫完全解耦,可是執行器須要配置調度中心集羣地址。調度中心提供API供執行器回調和心跳註冊服務,取消調度中心內部jetty,心跳週期調整爲30s,心跳失效爲三倍心跳;
  • 五、執行參數編輯時丟失問題修復;
  • 六、新增任務測試Demo,方便在開發時進行任務邏輯測試;

6.17 版本 V1.8.0 特性[2017-07-17]

  • 一、任務Cron更新邏輯優化,改成rescheduleJob,同時防止cron重複設置;
  • 二、API回調服務失敗狀態碼優化,方便問題排查;
  • 三、XxlJobLogger的日誌多參數支持;
  • 四、路由策略新增 "忙碌轉移" 模式:按照順序依次進行空閒檢測,第一個空閒檢測成功的機器選定爲目標執行器併發起調度;
  • 五、路由策略代碼重構;
  • 六、執行器重複註冊問題修復;
  • 七、任務線程輪空30次後自動銷燬,下降低頻任務的無效線程消耗。
  • 八、執行器任務執行結果批量回調,下降回調頻率提高執行器性能;
  • 九、springboot版本執行器,取消XML配置,改成類配置方式;
  • 十、執行日誌,支持根據運行 "狀態" 篩選日誌;
  • 十一、調度中心任務註冊檢測邏輯優化;

6.18 版本 V1.8.1 特性[2017-07-30]

  • 一、分片廣播任務:執行器集羣部署時,任務路由策略選擇"分片廣播"狀況下,一次任務調度將會廣播觸發集羣中全部執行器執行一次任務,可根據分片參數處理分片任務;
  • 二、動態分片:分片廣播任務以執行器爲維度進行分片,支持動態擴容執行器集羣從而動態增長分片數量,協同進行業務處理;在進行大數據量業務操做時可顯著提高任務處理能力和速度。
  • 三、執行器JobHandler禁止命名衝突;
  • 四、執行器集羣地址列表進行天然排序;
  • 五、調度中心,DAO層代碼精簡優化而且新增測試用例覆蓋;
  • 六、調度中心API服務改成自研RPC形式,統一底層通信模型;
  • 七、新增調度中心API服務測試Demo,方便在調度中心API擴展和測試;
  • 八、任務列表頁交互優化,更換執行器分組時自動刷新任務列表,新建任務時默認定位在當前執行器位置;
  • 九、訪問令牌(accessToken):爲提高系統安全性,調度中心和執行器進行安全性校驗,雙方AccessToken匹配才容許通信;
  • 十、springboot版本執行器,升級至1.5.6.RELEASE版本;
  • 十一、統一maven依賴版本管理;

6.19 版本 V1.8.2 特性[2017-09-04]

  • 一、項目主頁搭建:提供中英文文檔:http://www.xuxueli.com/xxl-job
  • 二、JFinal執行器Sample示例項目;
  • 三、事件觸發:除了"Cron方式"和"任務依賴方式"觸發任務執行以外,支持基於事件的觸發任務方式。調度中心提供觸發任務單次執行的API服務,可根據業務事件靈活觸發。
  • 四、執行器摘除:執行器銷燬時,主動通知調度中心並摘除對應執行器節點,提升執行器狀態感知的時效性。
  • 五、執行器手動設置IP時將會綁定Host;
  • 六、規範項目目錄,方便擴展多執行器;
  • 七、解決執行器回調URL不支持配置HTTPS時問題;
  • 八、執行器回調線程銷燬前, 批量回調隊列中數據,防止任務結果丟失;
  • 九、調度中心任務監控線程銷燬時,批量對失敗任務告警,防止告警信息丟失;
  • 十、任務日誌文件路徑時間戳格式化時SimpleDateFormat併發問題解決;

6.20 版本 V1.9.0 特性[2017-12-29]

  • 一、新增Nutz執行器Sample示例項目;
  • 二、新增任務運行模式 "GLUE模式(NodeJS) ",支持NodeJS腳本任務;
  • 三、腳本任務Shell、Python和Nodejs等支持獲取分片參數;
  • 四、失敗重試,完整支持:調度中心調度失敗且啓用"失敗重試"策略時,將會自動重試一次;執行器執行失敗且回調失敗重試狀態(新增失敗重試狀態返回值)時,也將會自動重試一次;
  • 五、失敗告警策略擴展:默認提供郵件失敗告警,可擴展短信等,擴展代碼位置爲 "JobFailMonitorHelper.failAlarm";
  • 六、執行器端口支持自動生成(小於等於0時),避免端口定義衝突;
  • 七、調度報表優化,支持時間區間篩選;
  • 八、Log組件支持輸出異常棧信息,底層實現優化;
  • 九、告警郵件樣式優化,調整爲表格形式,郵件組件調整爲commons-email簡化郵件操做;
  • 十、項目依賴全量升級至較新穩定版本,如spring、jackson等等;
  • 十一、任務日誌,記錄發起調度的機器信息;
  • 十二、交互優化,如登錄註銷;
  • 1三、任務Cron長度擴展支持至128位,支持負責類型Cron設置;
  • 1四、執行器地址錄入交互優化,地址長度擴展支持至512位,支持大規模執行器集羣配置;
  • 1五、任務參數「IJobHandler.execute」入參改成「String params」,加強入參通用性。
  • 1六、IJobHandler提供init/destroy方法,支持在相應任務線程初始化和銷燬時進行附加操做;
  • 1七、任務註解調整爲 「@JobHandler」,與任務抽象接口統一;
  • 1八、修復任務監控線程被耗時任務阻塞的問題;
  • 1九、修復任務監控線程沒法監控任務觸發和執行狀態均未0的問題;
  • 20、執行器動態代理對象,攔截非業務方法的執行;
  • 2一、修復JobThread捕獲Error錯誤不更新JobLog的問題;
  • 2二、修復任務列表界面左側菜單合併時樣式錯亂問題;
  • 2三、調度中心項目日誌配置改成xml文件格式;
  • 2四、Log地址格式兼容,支持非"/"結尾路徑配置;
  • 2五、底層系統日誌級別規範調整,清理遺留代碼;
  • 2六、建表SQL優化,支持同步建立制定編碼的庫和表;
  • 2七、系統安全性優化,登錄Token寫Cookie時進行MD5加密,同時Cookie啓用HttpOnly;
  • 2八、新增"任務ID"屬性,移除"JobKey"屬性,前者承擔全部功能,方便後續加強任務依賴功能。
  • 2九、任務循環依賴問題修復,避免子任務與父任務重複致使的調度死循環;
  • 30、任務列表新增篩選條件 "任務描述",快速檢索任務;
  • 3一、執行器Log文件按期清理功能:執行器新增配置項("xxl.job.executor.logretentiondays")日誌保存天數,日誌文件過時自動刪除。

6.21 版本 V1.9.1 特性[2018-02-22]

  • 一、國際化:調度中心實現國際化,支持中文、英文兩種語言,默認爲中文。
  • 二、調度報表新增"運行中"中狀態項;
  • 三、調度報表優化,報表SQL調優而且新增LocalCache緩存(緩存時間60s),提升大數據量下報表加載速度;
  • 四、修復打包部署時資源文件亂碼問題;
  • 五、修復新版本chrome滾動到頂部失效問題;
  • 六、調度中心配置加載優化,取消對配置文件名的強依賴,支持加載磁盤配置;
  • 七、修復腳本任務Log文件未正常close的問題;
  • 八、項目依賴全量升級至較新穩定版本,如spring、jackson等等;

6.22 版本 V1.9.2 特性[2018-10-05]

  • 一、任務超時控制:新增任務屬性 "任務超時時間",並支持自定義,任務運行超時將會主動中斷任務;
  • 二、任務失敗重試次數:新增任務屬性 "失敗重試次數",並支持自定義,當任務失敗時將會按照預設的失敗重試次數主動進行重試;同時收斂廢棄其餘失敗重試策略,如調度失敗、執行失敗、狀態碼失敗等;
  • 三、新增任務運行模式 "GLUE模式(PHP) ",支持php腳本任務;
  • 四、新增任務運行模式 "GLUE模式(PowerShell) ",支持PowerShell腳本任務;
  • 五、調度全異步處理:任務觸發以後,推送到調度隊列,多線程併發處理調度請求,提升任務調度速率的同時,避免因網絡問題致使quartz調度線程阻塞的問題;
  • 六、執行器任務結果落盤優化:執行器回調失敗時將任務結果寫磁盤,待重啓或網絡恢復時重試回調任務結果,防止任務執行結果丟失;
  • 七、任務日誌查詢速度大幅提高:百萬級別數據量搜索速度提高1000倍;
  • 八、調度中心提供API服務,支持經過API服務對任務進行查詢、新增、更新、啓停等操做;
  • 九、底層自研Log組件參數佔位符改成"{}",並修復打印有參日誌時參數不匹配致使報錯的問題;
  • 十、任務回調結果優化,支持展現在Rolling log中,方便問題排查;
  • 十一、底層LocalCache組件兼容性優化,支持jdk九、jdk10及以上版本編譯部署;
  • 十二、告警郵件固定使用 UTF-8 編碼格式,修復由機器編碼致使的郵件亂碼問題;
  • 1三、告警郵件中展現失敗告警信息;
  • 1四、告警郵箱支持SSL配置;
  • 1五、Window機器下File.separator不兼容問題修復;
  • 1六、腳本任務異常Log輸出優化;
  • 1七、任務線程中止變量修飾符優化;
  • 1八、腳本任務Log文件流關閉優化;
  • 1九、任務報表成功、失敗和進行中統計問題修復;
  • 20、核心依賴Core內部國際化處理;
  • 2一、默認Quartz線程數調整爲50;
  • 2二、新增左側菜單"運行報表";
  • 2三、執行器手動設置IP時取消綁定Host的操做,該IP僅供執行器註冊使用;修復指定外網IP時沒法綁定執行器Host的問題;
  • 2四、取消父子任務不可重複的限制,支持循環任務觸發等特殊場景;
  • 2五、任務調度備註中標註任務觸發類型,如Cron觸發、父任務觸發、API觸發等等,方便排查調度日誌;
  • 2六、底層日誌組件SimpleDateFormat線程安全問題修復;
  • 2七、執行器通信線程優化,corePoolSize從256下降至32;
  • 2八、任務日誌表狀態字段類型優化;
  • 2九、GLUE腳本文件自動清理功能,及時清理過時腳本文件;
  • 30、執行器註冊方式切換優化,切換自動註冊時主動同步在線機器,避免執行器爲空的問題;
  • 3一、跨平臺:除了提供Java、Python、PHP等十來種任務模式以外,新增提供基於HTTP的任務模式;
  • 3二、底層RPC序列化協議調整爲hessian2;
  • 3三、修復表字段 「t.order」與數據庫關鍵字衝突查詢失敗的問題,
  • 3四、任務屬性枚舉 "任務模式、阻塞策略" 國際化優化;
  • 3五、分片任務失敗重試優化,僅重試當前失敗的分片;
  • 3六、任務觸發時支持動態傳參,調度中心與API服務均提供提供動態參數功能;
  • 3七、任務執行日誌、調度日誌字段類型調整,改成text類型並取消字數限制;
  • 3八、GLUE任務腳本字段類型調整,改成mediumtext類型,提升GLUE長度上限;
  • 3九、任務監控線程Log輸出優化,運行中任務的監控Log改成debug級別,減小非核心日誌量;
  • 40、項目依賴全量升級至較新穩定版本,如spring、Jackson、groovy等等;
  • 4一、docker支持:調度中心提供 Dockerfile 方便快速構建docker鏡像;

6.23 版本 V2.0.0 Release Notes[2018-11-04]

  • 一、調度中心遷移到 springboot;
  • 二、底層通信組件遷移至 xxl-rpc;
  • 三、容器化:提供官方docker鏡像,並實時更新推送dockerhub(docker pull xuxueli/xxl-job-admin),進一步實現產品開箱即用;
  • 四、新增無框架執行器Sample示例項目 "xxl-job-executor-sample-frameless"。不依賴第三方框架,只需main方法便可啓動運行執行器;
  • 五、命令行任務:原生提供通用命令行任務Handler(Bean任務,"CommandJobHandler");業務方只須要提供命令行便可;
  • 六、任務狀態優化,僅運行狀態"NORMAL"任務關聯至quartz,下降quartz底層數據存儲與調度壓力;
  • 七、任務狀態規範:新增任務默認中止狀態,任務更新時保持任務狀態不變;
  • 八、IP獲取邏輯優化,優先遍歷網卡來獲取可用IP;
  • 九、任務新增的API服務接口返回任務ID,方便調用方實用;
  • 十、組件化優化,移除對 spring 的依賴:非spring應用選用 "XxlJobExecutor" 、spring應用選用 "XxlJobSpringExecutor" 做爲執行器組件;
  • 十一、任務RollingLog展現邏輯優化,修復超時任務沒法查看的問題;
  • 十二、多項UI組件升級到最新版本,如:CodeMirror、Echarts、Jquery 等;
  • 1三、項目依賴升級 groovy 至較新穩定版本;pom清理;
  • 1四、子任務失敗重試重試邏輯優化,子任務失敗時將會按照其預設的失敗重試次數主動進行重試

6.23 版本 v2.0.1 Release Notes[2018-11-09]

  • 一、左側菜單摺疊動畫問題修復;
  • 二、調度報表日期分佈圖默認值統一;
  • 三、freemarker對數字默認加千分位問題修復,解決日誌ID被分隔致使查看日誌失敗問題;
  • 四、底層通信組件升級,修復通信異常時無效等待的問題;
  • 五、執行器啓動以後jetty中止的問題修復;

6.24 版本 v2.0.2 Release Notes[迭代中]

  • 一、調度中心告警郵件發送組件改成 「spring-boot-starter-mail」;
  • 二、任務告警邏輯調整,改成經過掃描失敗日誌方式觸發。一方面精確掃描失敗任務,下降掃描範圍;另外一方面取消內存隊列,下降線程內存消耗;

TODO LIST

  • 一、任務分片路由:分片採用一致性Hash算法計算出儘可能穩定的分片順序,即便註冊機器存在波動也不會引發分批分片順序大的波動;目前採用IP天然排序,能夠知足需求,待定;
  • 二、任務單機多線程:提高任務單機並行處理能力;
  • 三、任務依賴,流程圖,子任務+會籤任務,各節點日誌;
  • 四、調度任務優先級;
  • 五、移除quartz依賴,重寫調度模塊:新增或恢復任務時將下次執行記錄插入delayqueue,調度中心集羣競爭分佈式鎖,成功節點批量加載到期delayqueue數據,批量執行。
  • 六、多數據庫支持,在重寫並移除Quartz的基礎上,DAO層經過JPA實現,不限制數據庫類型;
  • 七、執行器Log清理功能:調度中心Log刪除時同步刪除執行器中的Log文件;
  • 八、Bean模式任務,JobHandler自動從執行器中查詢展現爲下拉框,選擇後自動填充任務名稱等屬性;
  • 九、API事件觸發類型任務(更相似MQ消息)支持"動態傳參、延時消費";該類型任務不走Quartz,單獨創建MQ消息表,調度中心競爭觸發;待定,該功能與 XXL-MQ 衝突,該場景建議用後者;
  • 十、調度線程池改成協程方式實現,大幅下降系統內存消耗;
  • 十一、任務依賴加強,新增任務類型 "流程任務",流程節點可掛載普通類型任務,承擔任務依賴功能。現有子任務模型取消;須要考慮任務依賴死循環問題;
  • 十二、提供多版本執行器:不依賴容器版本、不內嵌Jetty版本(經過配置executoraddress替換jetty通信)等;
  • 1三、註冊中心支持擴展,除默認基於DB以外,支持擴展接入第三方註冊中心如zk、eureka等;
  • 1四、流程任務,支持參數傳遞;
  • 1五、Cron TimeZone 自定義;
  • 1六、忙碌轉移優化,所有機器忙碌時再也不直接失敗;
  • 1七、流程任務等,透傳動態參數;
  • 1八、任務支持切換執行器,quartz job group固定;
  • 1九、任務自動註冊;待考慮,由於任務自動註冊將會致使任務難以管理控制;
  • 20、批量觸發支持,添加參數 "org.quartz.scheduler.batchTriggerAcquisitionMaxCount: 50";
  • 2一、失敗重試間隔;
  • 2二、任務權限管理:執行器爲粒度分配權限,核心操做校驗權限;
  • 2三、SimpleTrigger 支持;
  • 2四、cron在線生成工具,如 "cronboot/cron.qqe2";
  • 2五、調度日誌列表加上執行時長列,並支持排序;

7、其餘

7.1 項目貢獻

歡迎參與項目貢獻!好比提交PR修復一個bug,或者新建 Issue 討論新特性或者變動。

7.2 用戶接入登記

更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。

7.3 開源協議和版權

產品開源免費,而且將持續提供免費的社區技術支持。我的或企業內部可自由的接入和使用。

  • Licensed under the GNU General Public License (GPL) v3.
  • Copyright (c) 2015-present, xuxueli.
相關文章
相關標籤/搜索