轻量级分布式任务调度平台 XXL-JOB
?
From:https://www.cnblogs.com/xuxueli/p/5021979.html
github 地址 及 中文文檔地址:https://github.com/xuxueli/xxl-job
?
?
《分布式任務(wù)調(diào)度平臺XXL-JOB》
?
?
一、簡介
1.1 概述
XXL-JOB是一個(gè)輕量級分布式任務(wù)調(diào)度平臺,其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴(kuò)展。現(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用。
1.2 特性
- 1、簡單:支持通過Web頁面對任務(wù)進(jìn)行CRUD操作,操作簡單,一分鐘上手;
- 2、動態(tài):支持動態(tài)修改任務(wù)狀態(tài)、暫停/恢復(fù)任務(wù),以及終止運(yùn)行中任務(wù),即時(shí)生效;
- 3、調(diào)度中心HA(中心式):調(diào)度采用中心式設(shè)計(jì),“調(diào)度中心”基于集群Quartz實(shí)現(xiàn)并支持集群部署,可保證調(diào)度中心HA;
- 4、執(zhí)行器HA(分布式):任務(wù)分布式執(zhí)行,任務(wù)"執(zhí)行器"支持集群部署,可保證任務(wù)執(zhí)行HA;
- 5、注冊中心: 執(zhí)行器會周期性自動注冊任務(wù), 調(diào)度中心將會自動發(fā)現(xiàn)注冊的任務(wù)并觸發(fā)執(zhí)行。同時(shí),也支持手動錄入執(zhí)行器地址;
- 6、彈性擴(kuò)容縮容:一旦有新執(zhí)行器機(jī)器上線或者下線,下次調(diào)度時(shí)將會重新分配任務(wù);
- 7、路由策略:執(zhí)行器集群部署時(shí)提供豐富的路由策略,包括:第一個(gè)、最后一個(gè)、輪詢、隨機(jī)、一致性HASH、最不經(jīng)常使用、最近最久未使用、故障轉(zhuǎn)移、忙碌轉(zhuǎn)移等;
- 8、故障轉(zhuǎn)移:任務(wù)路由策略選擇"故障轉(zhuǎn)移"情況下,如果執(zhí)行器集群中某一臺機(jī)器故障,將會自動Failover切換到一臺正常的執(zhí)行器發(fā)送調(diào)度請求。
- 9、阻塞處理策略:調(diào)度過于密集執(zhí)行器來不及處理時(shí)的處理策略,策略包括:單機(jī)串行(默認(rèn))、丟棄后續(xù)調(diào)度、覆蓋之前調(diào)度;
- 10、任務(wù)超時(shí)控制:支持自定義任務(wù)超時(shí)時(shí)間,任務(wù)運(yùn)行超時(shí)將會主動中斷任務(wù);
- 11、任務(wù)失敗重試:支持自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時(shí)將會按照預(yù)設(shè)的失敗重試次數(shù)主動進(jìn)行重試;其中分片任務(wù)支持分片粒度的失敗重試;
- 12、任務(wù)失敗告警;默認(rèn)提供郵件方式失敗告警,同時(shí)預(yù)留擴(kuò)展接口,可方面的擴(kuò)展短信、釘釘?shù)雀婢绞?#xff1b;
- 13、分片廣播任務(wù):執(zhí)行器集群部署時(shí),任務(wù)路由策略選擇"分片廣播"情況下,一次任務(wù)調(diào)度將會廣播觸發(fā)集群中所有執(zhí)行器執(zhí)行一次任務(wù),可根據(jù)分片參數(shù)開發(fā)分片任務(wù);
- 14、動態(tài)分片:分片廣播任務(wù)以執(zhí)行器為維度進(jìn)行分片,支持動態(tài)擴(kuò)容執(zhí)行器集群從而動態(tài)增加分片數(shù)量,協(xié)同進(jìn)行業(yè)務(wù)處理;在進(jìn)行大數(shù)據(jù)量業(yè)務(wù)操作時(shí)可顯著提升任務(wù)處理能力和速度。
- 15、事件觸發(fā):除了"Cron方式"和"任務(wù)依賴方式"觸發(fā)任務(wù)執(zhí)行之外,支持基于事件的觸發(fā)任務(wù)方式。調(diào)度中心提供觸發(fā)任務(wù)單次執(zhí)行的API服務(wù),可根據(jù)業(yè)務(wù)事件靈活觸發(fā)。
- 16、任務(wù)進(jìn)度監(jiān)控:支持實(shí)時(shí)監(jiān)控任務(wù)進(jìn)度;
- 17、Rolling實(shí)時(shí)日志:支持在線查看調(diào)度結(jié)果,并且支持以Rolling方式實(shí)時(shí)查看執(zhí)行器輸出的完整的執(zhí)行日志;
- 18、GLUE:提供Web IDE,支持在線開發(fā)任務(wù)邏輯代碼,動態(tài)發(fā)布,實(shí)時(shí)編譯生效,省略部署上線的過程。支持30個(gè)版本的歷史版本回溯。
- 19、腳本任務(wù):支持以GLUE模式開發(fā)和運(yùn)行腳本任務(wù),包括Shell、Python、NodeJS、PHP、PowerShell等類型腳本;
- 20、任務(wù)依賴:支持配置子任務(wù)依賴,當(dāng)父任務(wù)執(zhí)行結(jié)束且執(zhí)行成功后將會主動觸發(fā)一次子任務(wù)的執(zhí)行, 多個(gè)子任務(wù)用逗號分隔;
- 21、一致性:“調(diào)度中心”通過DB鎖保證集群分布式調(diào)度的一致性, 一次任務(wù)調(diào)度只會觸發(fā)一次執(zhí)行;
- 22、自定義任務(wù)參數(shù):支持在線配置調(diào)度任務(wù)入?yún)?#xff0c;即時(shí)生效;
- 23、調(diào)度線程池:調(diào)度系統(tǒng)多線程觸發(fā)調(diào)度運(yùn)行,確保調(diào)度精確執(zhí)行,不被堵塞;
- 24、數(shù)據(jù)加密:調(diào)度中心和執(zhí)行器之間的通訊進(jìn)行數(shù)據(jù)加密,提升調(diào)度信息安全性;
- 25、郵件報(bào)警:任務(wù)失敗時(shí)支持郵件報(bào)警,支持配置多郵件地址群發(fā)報(bào)警郵件;
- 26、推送maven中央倉庫: 將會把最新穩(wěn)定版推送到maven中央倉庫, 方便用戶接入和使用;
- 27、運(yùn)行報(bào)表:支持實(shí)時(shí)查看運(yùn)行數(shù)據(jù),如任務(wù)數(shù)量、調(diào)度次數(shù)、執(zhí)行器數(shù)量等;以及調(diào)度報(bào)表,如調(diào)度日期分布圖,調(diào)度成功分布圖等;
- 28、全異步:任務(wù)調(diào)度流程全異步化設(shè)計(jì)實(shí)現(xiàn),如異步調(diào)度、異步運(yùn)行、異步回調(diào)等,有效對密集調(diào)度進(jìn)行流量削峰,理論上支持任意時(shí)長任務(wù)的運(yùn)行;
- 29、跨平臺:原生提供通用HTTP任務(wù)Handler(Bean任務(wù),"httpJobHandler");業(yè)務(wù)方只需要提供HTTP鏈接即可,不限制語言、平臺;
- 30、國際化:調(diào)度中心支持國際化設(shè)置,提供中文、英文兩種可選語言,默認(rèn)為中文;
1.3 發(fā)展
于2015年中,我在github上創(chuàng)建XXL-JOB項(xiàng)目倉庫并提交第一個(gè)commit,隨之進(jìn)行系統(tǒng)結(jié)構(gòu)設(shè)計(jì),UI選型,交互設(shè)計(jì)……
于2015-11月,XXL-JOB終于RELEASE了第一個(gè)大版本V1.0, 隨后我將之發(fā)布到OSCHINA,XXL-JOB在OSCHINA上獲得了@紅薯的熱門推薦,同期分別達(dá)到了OSCHINA的“熱門動彈”排行第一和git.oschina的開源軟件月熱度排行第一,在此特別感謝紅薯,感謝大家的關(guān)注和支持。
于2015-12月,我將XXL-JOB發(fā)表到我司內(nèi)部知識庫,并且得到內(nèi)部同事認(rèn)可。
于2016-01月,我司展開XXL-JOB的內(nèi)部接入和定制工作,在此感謝袁某和尹某兩位同事的貢獻(xiàn),同時(shí)也感謝內(nèi)部其他給與關(guān)注與支持的同事。
于2017-05-13,在上海舉辦的 "第62期開源中國源創(chuàng)會" 的 "放碼過來" 環(huán)節(jié),我登臺對XXL-JOB做了演講,臺下五百位在場觀眾反響熱烈(圖文回顧?)。
于2017-10-22,又拍云 Open Talk 聯(lián)合 Spring Cloud 中國社區(qū)舉辦的 "進(jìn)擊的微服務(wù)實(shí)戰(zhàn)派上海站",我登臺對XXL-JOB做了演講,現(xiàn)場觀眾反響熱烈并在會后與XXL-JOB用戶熱烈討論交流。
于2017-12-11,XXL-JOB有幸參會《InfoQ ArchSummit全球架構(gòu)師峰會》,并被拍拍貸架構(gòu)總監(jiān)"楊波老師"在專題 "微服務(wù)原理、基礎(chǔ)架構(gòu)和開源實(shí)踐" 中現(xiàn)場介紹。
于2017-12-18,XXL-JOB參與"2017年度最受歡迎中國開源軟件"評比,在當(dāng)時(shí)已錄入的約九千個(gè)國產(chǎn)開源項(xiàng)目中角逐,最終進(jìn)入了前30強(qiáng)。
于2018-01-15,XXL-JOB參與"2017碼云最火開源項(xiàng)目"評比,在當(dāng)時(shí)已錄入的約六千五百個(gè)碼云項(xiàng)目中角逐,最終進(jìn)去了前20強(qiáng)。
于2018-04-14,iTechPlus在上海舉辦的 "2018互聯(lián)網(wǎng)開發(fā)者大會",我登臺對XXL-JOB做了演講,現(xiàn)場觀眾反響熱烈并在會后與XXL-JOB用戶熱烈討論交流。
于2018-05-27,在上海舉辦的 "第75期開源中國源創(chuàng)會" 的 "架構(gòu)" 主題專場,我登臺進(jìn)行“基礎(chǔ)架構(gòu)與中間件圖譜”主題演講,臺下上千位在場觀眾反響熱烈(圖文回顧?)。
我司大眾點(diǎn)評目前已接入XXL-JOB,內(nèi)部別名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入應(yīng)用推薦升級最新版本)。 據(jù)最新統(tǒng)計(jì), 自2016-01-21接入至2017-12-01期間,該系統(tǒng)已調(diào)度約100萬次,表現(xiàn)優(yōu)異。新接入應(yīng)用推薦使用最新版本,因?yàn)榻?jīng)過數(shù)十個(gè)版本的更新,系統(tǒng)的任務(wù)模型、UI交互模型以及底層調(diào)度通訊模型都有了較大的優(yōu)化和提升,核心功能更加穩(wěn)定高效。
至今,XXL-JOB已接入多家公司的線上產(chǎn)品線,接入場景如電商業(yè)務(wù),O2O業(yè)務(wù)和大數(shù)據(jù)作業(yè)等
?
1.4 下載
文檔地址
- 中文文檔
- English Documentation
源碼倉庫地址
| 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>${最新穩(wěn)定版本}</version> </dependency>技術(shù)交流
- 社區(qū)交流
- Gitter
1.5 環(huán)境
- 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.1 初始化“調(diào)度數(shù)據(jù)庫”
請下載項(xiàng)目源碼并解壓,獲取 "調(diào)度數(shù)據(jù)庫初始化SQL腳本" 并執(zhí)行即可,正常情況下應(yīng)該生成16張表。
"調(diào)度數(shù)據(jù)庫初始化SQL腳本" 位置為:
/xxl-job/doc/db/tables_xxl_job.sql調(diào)度中心支持集群部署,集群情況下各節(jié)點(diǎn)務(wù)必連接同一個(gè)mysql實(shí)例;
如果mysql做主從,調(diào)度中心集群節(jié)點(diǎn)務(wù)必強(qiáng)制走主庫;
2.2 編譯源碼
解壓源碼,按照maven格式將源碼導(dǎo)入IDE, 使用maven進(jìn)行編譯即可,源碼結(jié)構(gòu)如下:
xxl-job-admin:調(diào)度中心 xxl-job-core:公共依賴 xxl-job-executor:執(zhí)行器Sample示例(選擇合適的版本執(zhí)行器,可直接使用,也可以參考其并將現(xiàn)有項(xiàng)目改造成執(zhí)行器):xxl-job-executor-sample-spring:Spring版本,通過Spring容器管理執(zhí)行器,比較通用,推薦這種方式;:xxl-job-executor-sample-springboot:Springboot版本,通過Springboot管理執(zhí)行器;:xxl-job-executor-sample-jfinal:JFinal版本,通過JFinal管理執(zhí)行器;:xxl-job-executor-sample-nutz:Nutz版本,通過Nutz管理執(zhí)行器;2.3 配置部署“調(diào)度中心”
調(diào)度中心項(xiàng)目:xxl-job-admin 作用:統(tǒng)一管理任務(wù)調(diào)度平臺上調(diào)度任務(wù),負(fù)責(zé)觸發(fā)調(diào)度執(zhí)行,并且提供任務(wù)管理平臺。步驟一:調(diào)度中心配置:
調(diào)度中心配置文件地址:
/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties調(diào)度中心配置內(nèi)容說明:
### 調(diào)度中心JDBC鏈接:鏈接地址請保持和 2.1章節(jié) 所創(chuàng)建的調(diào)度數(shù)據(jù)庫的地址一致 xxl.job.db.driverClass=com.mysql.jdbc.Driver xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8 xxl.job.db.user=root xxl.job.db.password=root_pwd### 報(bào)警郵箱 xxl.job.mail.host=smtp.163.com xxl.job.mail.port=25 xxl.job.mail.ssl=false xxl.job.mail.username=ovono802302@163.com xxl.job.mail.password=asdfzxcv xxl.job.mail.sendFrom=ovono802302@163.com xxl.job.mail.sendNick=《任務(wù)調(diào)度平臺XXL-JOB》### 登錄賬號 xxl.job.login.username=admin xxl.job.login.password=123456### 調(diào)度中心通訊TOKEN,非空時(shí)啟用 xxl.job.accessToken=### 調(diào)度中心國際化設(shè)置,默認(rèn)為中文版本,值設(shè)置為“en”時(shí)切換為英文版本 xxl.job.i18n=步驟二:部署項(xiàng)目:
如果已經(jīng)正確進(jìn)行上述配置,可將項(xiàng)目編譯打war包并部署到tomcat中。 調(diào)度中心訪問地址:http://localhost:8080/xxl-job-admin?(該地址執(zhí)行器將會使用到,作為回調(diào)地址),登錄后運(yùn)行界面如下圖所示
至此“調(diào)度中心”項(xiàng)目已經(jīng)部署成功。
步驟三:調(diào)度中心集群(可選):
調(diào)度中心支持集群部署,提升調(diào)度系統(tǒng)容災(zāi)和可用性。
調(diào)度中心集群部署時(shí),幾點(diǎn)要求和建議:
- DB配置保持一致;
- 登陸賬號配置保持一致;
- 集群機(jī)器時(shí)鐘保持一致(單機(jī)集群忽視);
- 建議:推薦通過nginx為調(diào)度中心集群做負(fù)載均衡,分配域名。調(diào)度中心訪問、執(zhí)行器回調(diào)配置、調(diào)用API服務(wù)等操作均通過該域名進(jìn)行。
2.4 配置部署“執(zhí)行器項(xiàng)目”
“執(zhí)行器”項(xiàng)目:xxl-job-executor-sample-spring (提供多種版本執(zhí)行器供選擇,現(xiàn)以Spring版本為例,可直接使用,也可以參考其并將現(xiàn)有項(xiàng)目改造成執(zhí)行器) 作用:負(fù)責(zé)接收“調(diào)度中心”的調(diào)度并執(zhí)行;可直接部署執(zhí)行器,也可以將執(zhí)行器集成到現(xiàn)有業(yè)務(wù)項(xiàng)目中。步驟一:maven依賴
確認(rèn)pom文件中引入了 "xxl-job-core" 的maven依賴;
步驟二:執(zhí)行器配置
執(zhí)行器配置,配置文件地址:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties執(zhí)行器配置,配置內(nèi)容說明:
### xxl-job admin address list:調(diào)度中心部署跟地址:如調(diào)度中心集群部署存在多個(gè)地址則用逗號分隔。執(zhí)行器將會使用該地址進(jìn)行"執(zhí)行器心跳注冊"和"任務(wù)結(jié)果回調(diào)"。 xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### xxl-job executor address:執(zhí)行器"AppName"和地址信息配置:AppName執(zhí)行器心跳注冊分組依據(jù);地址信息用于"調(diào)度中心請求并觸發(fā)任務(wù)"和"執(zhí)行器注冊"。執(zhí)行器默認(rèn)端口為9999,執(zhí)行器IP默認(rèn)為空表示自動獲取IP,多網(wǎng)卡時(shí)可手動設(shè)置指定IP,該IP不會綁定Host僅作為通訊實(shí)用。單機(jī)部署多個(gè)執(zhí)行器時(shí),注意要配置不同執(zhí)行器端口; xxl.job.executor.appname=xxl-job-executor-sample xxl.job.executor.ip= xxl.job.executor.port=9999### xxl-job, access token:執(zhí)行器通訊TOKEN,非空時(shí)啟用 xxl.job.accessToken=### xxl-job log path:執(zhí)行器運(yùn)行日志文件存儲的磁盤位置,需要對該路徑擁有讀寫權(quán)限 xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/### xxl-job log retention days:執(zhí)行器Log文件定期清理功能,指定日志保存天數(shù),日志文件過期自動刪除。限制至少保持3天,否則功能不生效; xxl.job.executor.logretentiondays=-1步驟三:執(zhí)行器組件配置
執(zhí)行器組件,配置文件地址:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml執(zhí)行器組件,配置內(nèi)容說明:
<!-- 配置01、JobHandler 掃描路徑:自動掃描容器中JobHandler --> <context:component-scan base-package="com.xxl.job.executor.service.jobhandler" /><!-- 配置02、執(zhí)行器 --> <bean id="xxlJobExecutor" class="com.xxl.job.core.executor.XxlJobExecutor" init-method="start" destroy-method="destroy" ><!-- 執(zhí)行器注冊中心地址[選填],為空則關(guān)閉自動注冊 --><property name="adminAddresses" value="${xxl.job.admin.addresses}" /><!-- 執(zhí)行器AppName[選填],為空則關(guān)閉自動注冊 --><property name="appName" value="${xxl.job.executor.appname}" /><!-- 執(zhí)行器IP[選填],為空則自動獲取 --><property name="ip" value="${xxl.job.executor.ip}" /><!-- 執(zhí)行器端口號[選填],小于等于0則自動獲取 --><property name="port" value="${xxl.job.executor.port}" /><!-- 訪問令牌[選填],非空則進(jìn)行匹配校驗(yàn) --><property name="accessToken" value="${xxl.job.accessToken}" /><!-- 執(zhí)行器日志路徑[選填],為空則使用默認(rèn)路徑 --><property name="logPath" value="${xxl.job.executor.logpath}" /><!-- 日志保存天數(shù)[選填],值大于3時(shí)生效 --><property name="logRetentionDays" value="${xxl.job.executor.logretentiondays}" /> </bean>步驟四:部署執(zhí)行器項(xiàng)目:
如果已經(jīng)正確進(jìn)行上述配置,可將執(zhí)行器項(xiàng)目編譯打部署,系統(tǒng)提供多種執(zhí)行器Sample示例項(xiàng)目,選擇其中一個(gè)即可,各自的部署方式如下。
xxl-job-executor-sample-springboot:項(xiàng)目編譯打包成springboot類型的可執(zhí)行JAR包,命令啟動即可; xxl-job-executor-sample-spring:項(xiàng)目編譯打包成WAR包,并部署到tomcat中。 xxl-job-executor-sample-jfinal:同上 xxl-job-executor-sample-nutz:同上至此“執(zhí)行器”項(xiàng)目已經(jīng)部署結(jié)束。
步驟五:執(zhí)行器集群(可選):
執(zhí)行器支持集群部署,提升調(diào)度系統(tǒng)可用性,同時(shí)提升任務(wù)處理能力。
執(zhí)行器集群部署時(shí),幾點(diǎn)要求和建議:
- 執(zhí)行器回調(diào)地址(xxl.job.admin.addresses)需要保持一致;執(zhí)行器根據(jù)該配置進(jìn)行執(zhí)行器自動注冊等操作。
- 同一個(gè)執(zhí)行器集群內(nèi)AppName(xxl.job.executor.appname)需要保持一致;調(diào)度中心根據(jù)該配置動態(tài)發(fā)現(xiàn)不同集群的在線執(zhí)行器列表。
2.5 開發(fā)第一個(gè)任務(wù)“Hello World”
本示例以新建一個(gè) “GLUE模式(Java)” 運(yùn)行模式的任務(wù)為例。更多有關(guān)任務(wù)的詳細(xì)配置,請查看“章節(jié)三:任務(wù)詳解”。 ( “GLUE模式(Java)”的執(zhí)行代碼托管到調(diào)度中心在線維護(hù),相比“Bean模式任務(wù)”需要在執(zhí)行器項(xiàng)目開發(fā)部署上線,更加簡便輕量)
前提:請確認(rèn)“調(diào)度中心”和“執(zhí)行器”項(xiàng)目已經(jīng)成功部署并啟動;
步驟一:新建任務(wù):
登錄調(diào)度中心,點(diǎn)擊下圖所示“新建任務(wù)”按鈕,新建示例任務(wù)。然后,參考下面截圖中任務(wù)的參數(shù)配置,點(diǎn)擊保存。
步驟二:“GLUE模式(Java)” 任務(wù)開發(fā):
請點(diǎn)擊任務(wù)右側(cè) “GLUE” 按鈕,進(jìn)入 “GLUE編輯器開發(fā)界面” ,見下圖。“GLUE模式(Java)” 運(yùn)行模式的任務(wù)默認(rèn)已經(jīng)初始化了示例任務(wù)代碼,即打印Hello World。 ( “GLUE模式(Java)” 運(yùn)行模式的任務(wù)實(shí)際上是一段繼承自IJobHandler的Java類代碼,它在執(zhí)行器項(xiàng)目中運(yùn)行,可使用@Resource/@Autowire注入執(zhí)行器里中的其他服務(wù),詳細(xì)介紹請查看第三章節(jié))
步驟三:觸發(fā)執(zhí)行:
請點(diǎn)擊任務(wù)右側(cè) “執(zhí)行” 按鈕,可手動觸發(fā)一次任務(wù)執(zhí)行(通常情況下,通過配置Cron表達(dá)式進(jìn)行任務(wù)調(diào)度出發(fā))。
步驟四:查看日志:
請點(diǎn)擊任務(wù)右側(cè) “日志” 按鈕,可前往任務(wù)日志界面查看任務(wù)日志。 在任務(wù)日志界面中,可查看該任務(wù)的歷史調(diào)度記錄以及每一次調(diào)度的任務(wù)調(diào)度信息、執(zhí)行參數(shù)和執(zhí)行信息。運(yùn)行中的任務(wù)點(diǎn)擊右側(cè)的“執(zhí)行日志”按鈕,可進(jìn)入日志控制臺查看實(shí)時(shí)執(zhí)行日志。
在日志控制臺,可以Rolling方式實(shí)時(shí)查看任務(wù)在執(zhí)行器一側(cè)運(yùn)行輸出的日志信息,實(shí)時(shí)監(jiān)控任務(wù)進(jìn)度;
三、任務(wù)詳解
配置屬性詳細(xì)說明:
- 執(zhí)行器:任務(wù)的綁定的執(zhí)行器,任務(wù)觸發(fā)調(diào)度時(shí)將會自動發(fā)現(xiàn)注冊成功的執(zhí)行器, 實(shí)現(xiàn)任務(wù)自動發(fā)現(xiàn)功能; 另一方面也可以方便的進(jìn)行任務(wù)分組。每個(gè)任務(wù)必須綁定一個(gè)執(zhí)行器, 可在 "執(zhí)行器管理" 進(jìn)行設(shè)置; - 任務(wù)描述:任務(wù)的描述信息,便于任務(wù)管理; - 路由策略:當(dāng)執(zhí)行器集群部署時(shí),提供豐富的路由策略,包括;FIRST(第一個(gè)):固定選擇第一個(gè)機(jī)器;LAST(最后一個(gè)):固定選擇最后一個(gè)機(jī)器;ROUND(輪詢):;RANDOM(隨機(jī)):隨機(jī)選擇在線的機(jī)器;CONSISTENT_HASH(一致性HASH):每個(gè)任務(wù)按照Hash算法固定選擇某一臺機(jī)器,且所有任務(wù)均勻散列在不同機(jī)器上。LEAST_FREQUENTLY_USED(最不經(jīng)常使用):使用頻率最低的機(jī)器優(yōu)先被選舉;LEAST_RECENTLY_USED(最近最久未使用):最久為使用的機(jī)器優(yōu)先被選舉;FAILOVER(故障轉(zhuǎn)移):按照順序依次進(jìn)行心跳檢測,第一個(gè)心跳檢測成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;BUSYOVER(忙碌轉(zhuǎn)移):按照順序依次進(jìn)行空閑檢測,第一個(gè)空閑檢測成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;SHARDING_BROADCAST(分片廣播):廣播觸發(fā)對應(yīng)集群中所有機(jī)器執(zhí)行一次任務(wù),同時(shí)傳遞分片參數(shù);可根據(jù)分片參數(shù)開發(fā)分片任務(wù);- Cron:觸發(fā)任務(wù)執(zhí)行的Cron表達(dá)式; - 運(yùn)行模式:BEAN模式:任務(wù)以JobHandler方式維護(hù)在執(zhí)行器端;需要結(jié)合 "JobHandler" 屬性匹配執(zhí)行器中任務(wù);GLUE模式(Java):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段繼承自IJobHandler的Java類代碼并 "groovy" 源碼方式維護(hù),它在執(zhí)行器項(xiàng)目中運(yùn)行,可使用@Resource/@Autowire注入執(zhí)行器里中的其他服務(wù);GLUE模式(Shell):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "shell" 腳本;GLUE模式(Python):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "python" 腳本;GLUE模式(PHP):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "php" 腳本;GLUE模式(NodeJS):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "nodejs" 腳本;GLUE模式(PowerShell):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實(shí)際上是一段 "PowerShell" 腳本; - JobHandler:運(yùn)行模式為 "BEAN模式" 時(shí)生效,對應(yīng)執(zhí)行器中新開發(fā)的JobHandler類“@JobHandler”注解自定義的value值; - 阻塞處理策略:調(diào)度過于密集執(zhí)行器來不及處理時(shí)的處理策略;單機(jī)串行(默認(rèn)):調(diào)度請求進(jìn)入單機(jī)執(zhí)行器后,調(diào)度請求進(jìn)入FIFO隊(duì)列并以串行方式運(yùn)行;丟棄后續(xù)調(diào)度:調(diào)度請求進(jìn)入單機(jī)執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù),本次請求將會被丟棄并標(biāo)記為失敗;覆蓋之前調(diào)度:調(diào)度請求進(jìn)入單機(jī)執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù),將會終止運(yùn)行中的調(diào)度任務(wù)并清空隊(duì)列,然后運(yùn)行本地調(diào)度任務(wù); - 子任務(wù):每個(gè)任務(wù)都擁有一個(gè)唯一的任務(wù)ID(任務(wù)ID可以從任務(wù)列表獲取),當(dāng)本任務(wù)執(zhí)行結(jié)束并且執(zhí)行成功時(shí),將會觸發(fā)子任務(wù)ID所對應(yīng)的任務(wù)的一次主動調(diào)度。 - 任務(wù)超時(shí)時(shí)間:支持自定義任務(wù)超時(shí)時(shí)間,任務(wù)運(yùn)行超時(shí)將會主動中斷任務(wù); - 失敗重試次數(shù);支持自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時(shí)將會按照預(yù)設(shè)的失敗重試次數(shù)主動進(jìn)行重試; - 報(bào)警郵件:任務(wù)調(diào)度失敗時(shí)郵件通知的郵箱地址,支持配置多郵箱地址,配置多個(gè)郵箱地址時(shí)用逗號分隔; - 負(fù)責(zé)人:任務(wù)的負(fù)責(zé)人; - 執(zhí)行參數(shù):任務(wù)執(zhí)行所需的參數(shù),多個(gè)參數(shù)時(shí)用逗號分隔,任務(wù)執(zhí)行時(shí)將會把多個(gè)參數(shù)轉(zhuǎn)換成數(shù)組傳入;3.1 BEAN模式
任務(wù)邏輯以JobHandler的形式存在于“執(zhí)行器”所在項(xiàng)目中,開發(fā)流程如下:
步驟一:執(zhí)行器項(xiàng)目中,開發(fā)JobHandler:
- 1、繼承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;- 2、注冊到Spring容器:添加“@Component”注解,被Spring容器掃描為Bean實(shí)例;- 3、注冊到執(zhí)行器工廠:添加“@JobHandler(value="自定義jobhandler名稱")”注解,注解value值對應(yīng)的是調(diào)度中心新建任務(wù)的JobHandler屬性的值。- 4、執(zhí)行日志:需要通過 "XxlJobLogger.log" 打印執(zhí)行日志; (可參考Sample示例執(zhí)行器中的DemoJobHandler,見下圖)步驟二:調(diào)度中心,新建調(diào)度任務(wù)
參考上文“配置屬性詳細(xì)說明”對新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 "BEAN模式",JobHandler屬性填寫任務(wù)注解“@JobHandler”中定義的值;
3.2 GLUE模式(Java)
任務(wù)以源碼方式維護(hù)在調(diào)度中心,支持通過Web IDE在線更新,實(shí)時(shí)編譯和生效,因此不需要指定JobHandler。開發(fā)流程如下:
步驟一:調(diào)度中心,新建調(diào)度任務(wù):
參考上文“配置屬性詳細(xì)說明”對新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 "GLUE模式(Java)";
步驟二:開發(fā)任務(wù)代碼:
選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會前往GLUE任務(wù)的Web IDE界面,在該界面支持對任務(wù)代碼進(jìn)行開發(fā)(也可以在IDE中開發(fā)完成后,復(fù)制粘貼到編輯中)。
版本回溯功能(支持30個(gè)版本的版本回溯):在GLUE任務(wù)的Web IDE界面,選擇右上角下拉框“版本回溯”,會列出該GLUE的更新歷史,選擇相應(yīng)版本即可顯示該版本代碼,保存后GLUE代碼即回退到對應(yīng)的歷史版本;
3.3 GLUE模式(Shell)
步驟一:調(diào)度中心,新建調(diào)度任務(wù)
參考上文“配置屬性詳細(xì)說明”對新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 "GLUE模式(Shell)";
步驟二:開發(fā)任務(wù)代碼:
選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會前往GLUE任務(wù)的Web IDE界面,在該界面支持對任務(wù)代碼進(jìn)行開發(fā)(也可以在IDE中開發(fā)完成后,復(fù)制粘貼到編輯中)。
該模式的任務(wù)實(shí)際上是一段 "shell" 腳本;
3.4 GLUE模式(Python)
步驟一:調(diào)度中心,新建調(diào)度任務(wù)
參考上文“配置屬性詳細(xì)說明”對新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 "GLUE模式(Python)";
步驟二:開發(fā)任務(wù)代碼:
選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會前往GLUE任務(wù)的Web IDE界面,在該界面支持對任務(wù)代碼進(jìn)行開發(fā)(也可以在IDE中開發(fā)完成后,復(fù)制粘貼到編輯中)。
該模式的任務(wù)實(shí)際上是一段 "python" 腳本;
3.5 GLUE模式(NodeJS)
步驟一:調(diào)度中心,新建調(diào)度任務(wù)
參考上文“配置屬性詳細(xì)說明”對新建的任務(wù)進(jìn)行參數(shù)配置,運(yùn)行模式選中 "GLUE模式(NodeJS)";
步驟二:開發(fā)任務(wù)代碼:
選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會前往GLUE任務(wù)的Web IDE界面,在該界面支持對任務(wù)代碼進(jìn)行開發(fā)(也可以在IDE中開發(fā)完成后,復(fù)制粘貼到編輯中)。
該模式的任務(wù)實(shí)際上是一段 "nodejS" 腳本;
3.6 GLUE模式(PHP)
同上
3.7 GLUE模式(PowerShell)
同上
?
?
四、任務(wù)管理
4.0 配置執(zhí)行器
點(diǎn)擊進(jìn)入"執(zhí)行器管理"界面, 如下圖:?
1、"調(diào)度中心OnLine:"右側(cè)顯示在線的"調(diào)度中心"列表, 任務(wù)執(zhí)行結(jié)束后, 將會以failover的模式進(jìn)行回調(diào)調(diào)度中心通知執(zhí)行結(jié)果, 避免回調(diào)的單點(diǎn)風(fēng)險(xiǎn); 2、"執(zhí)行器列表" 中顯示在線的執(zhí)行器列表, 可通過"OnLine 機(jī)器"查看對應(yīng)執(zhí)行器的集群機(jī)器。點(diǎn)擊按鈕 "+新增執(zhí)行器" 彈框如下圖, 可新增執(zhí)行器配置:
執(zhí)行器屬性說明
AppName: 是每個(gè)執(zhí)行器集群的唯一標(biāo)示AppName, 執(zhí)行器會周期性以AppName為對象進(jìn)行自動注冊。可通過該配置自動發(fā)現(xiàn)注冊成功的執(zhí)行器, 供任務(wù)調(diào)度時(shí)使用; 名稱: 執(zhí)行器的名稱, 因?yàn)锳ppName限制字母數(shù)字等組成,可讀性不強(qiáng), 名稱為了提高執(zhí)行器的可讀性; 排序: 執(zhí)行器的排序, 系統(tǒng)中需要執(zhí)行器的地方,如任務(wù)新增, 將會按照該排序讀取可用的執(zhí)行器列表; 注冊方式:調(diào)度中心獲取執(zhí)行器地址的方式;自動注冊:執(zhí)行器自動進(jìn)行執(zhí)行器注冊,調(diào)度中心通過底層注冊表可以動態(tài)發(fā)現(xiàn)執(zhí)行器機(jī)器地址;手動錄入:人工手動錄入執(zhí)行器的地址信息,多地址逗號分隔,供調(diào)度中心使用; 機(jī)器地址:"注冊方式"為"手動錄入"時(shí)有效,支持人工維護(hù)執(zhí)行器的地址信息;4.1 新建任務(wù)
進(jìn)入任務(wù)管理界面,點(diǎn)擊“新增任務(wù)”按鈕,在彈出的“新增任務(wù)”界面配置任務(wù)屬性后保存即可。詳情頁參考章節(jié) "三、任務(wù)詳解"。
4.2 編輯任務(wù)
進(jìn)入任務(wù)管理界面,選中指定任務(wù)。點(diǎn)擊該任務(wù)右側(cè)“編輯”按鈕,在彈出的“編輯任務(wù)”界面更新任務(wù)屬性后保存即可,可以修改設(shè)置的任務(wù)屬性信息:
4.3 編輯GLUE代碼
該操作僅針對GLUE任務(wù)。
選中指定任務(wù),點(diǎn)擊該任務(wù)右側(cè)“GLUE”按鈕,將會前往GLUE任務(wù)的Web IDE界面,在該界面支持對任務(wù)代碼進(jìn)行開發(fā)。可參考章節(jié) "3.2 GLUE模式(Java)"。
4.4 暫停/恢復(fù)任務(wù)
可對任務(wù)進(jìn)行“暫停”和“恢復(fù)”操作。 需要注意的是,此處的暫停/恢復(fù)僅針對任務(wù)的后續(xù)調(diào)度觸發(fā)行為,不會影響到已經(jīng)觸發(fā)的調(diào)度任務(wù),如需終止已經(jīng)觸發(fā)的調(diào)度任務(wù),可查看“4.8 終止運(yùn)行中的任務(wù)”
4.5 手動觸發(fā)一次調(diào)度
點(diǎn)擊“執(zhí)行”按鈕,可手動觸發(fā)一次任務(wù)調(diào)度,不影響原有調(diào)度規(guī)則。
4.6 查看調(diào)度日志
點(diǎn)擊“日志”按鈕,可以查看任務(wù)歷史調(diào)度日志。在歷史調(diào)入日志界面可查看每次任務(wù)調(diào)度的調(diào)度結(jié)果、執(zhí)行結(jié)果等,點(diǎn)擊“執(zhí)行日志”按鈕可查看執(zhí)行器完整日志。
調(diào)度時(shí)間:"調(diào)度中心"觸發(fā)本次調(diào)度并向"執(zhí)行器"發(fā)送任務(wù)執(zhí)行信號的時(shí)間; 調(diào)度結(jié)果:"調(diào)度中心"觸發(fā)本次調(diào)度的結(jié)果,200表示成功,500或其他表示失敗; 調(diào)度備注:"調(diào)度中心"觸發(fā)本次調(diào)度的日志信息; 執(zhí)行器地址:本次任務(wù)執(zhí)行的機(jī)器地址 運(yùn)行模式:觸發(fā)調(diào)度時(shí)任務(wù)的運(yùn)行模式,運(yùn)行模式可參考章節(jié) "三、任務(wù)詳解"; 任務(wù)參數(shù):本地任務(wù)執(zhí)行的入?yún)?執(zhí)行時(shí)間:"執(zhí)行器"中本次任務(wù)執(zhí)行結(jié)束后回調(diào)的時(shí)間; 執(zhí)行結(jié)果:"執(zhí)行器"中本次任務(wù)執(zhí)行的結(jié)果,200表示成功,500或其他表示失敗; 執(zhí)行備注:"執(zhí)行器"中本次任務(wù)執(zhí)行的日志信息; 操作:"執(zhí)行日志"按鈕:點(diǎn)擊可查看本地任務(wù)執(zhí)行的詳細(xì)日志信息;詳見“4.7 查看執(zhí)行日志”;"終止任務(wù)"按鈕:點(diǎn)擊可終止本地調(diào)度對應(yīng)執(zhí)行器上本任務(wù)的執(zhí)行線程,包括未執(zhí)行的阻塞任務(wù)一并被終止;4.7 查看執(zhí)行日志
點(diǎn)擊執(zhí)行日志右側(cè)的 “執(zhí)行日志” 按鈕,可跳轉(zhuǎn)至執(zhí)行日志界面,可以查看業(yè)務(wù)代碼中打印的完整日志,如下圖;
4.8 終止運(yùn)行中的任務(wù)
僅針對執(zhí)行中的任務(wù)。 在任務(wù)日志界面,點(diǎn)擊右側(cè)的“終止任務(wù)”按鈕,將會向本次任務(wù)對應(yīng)的執(zhí)行器發(fā)送任務(wù)終止請求,將會終止掉本次任務(wù),同時(shí)會清空掉整個(gè)任務(wù)執(zhí)行隊(duì)列。
任務(wù)終止時(shí)通過 "interrupt" 執(zhí)行線程的方式實(shí)現(xiàn), 將會觸發(fā) "InterruptedException" 異常。因此如果JobHandler內(nèi)部catch到了該異常并消化掉的話, 任務(wù)終止功能將不可用。
因此, 如果遇到上述任務(wù)終止不可用的情況, 需要在JobHandler中應(yīng)該針對 "InterruptedException" 異常進(jìn)行特殊處理 (向上拋出) , 正確邏輯如下:
try{// TODO } catch (Exception e) {if (e instanceof InterruptedException) {throw e;}logger.warn("{}", e); }而且,在JobHandler中開啟子線程時(shí),子線程也不可catch處理"InterruptedException",應(yīng)該主動向上拋出。
4.9 刪除執(zhí)行日志
在任務(wù)日志界面,選中執(zhí)行器和任務(wù)之后,點(diǎn)擊右側(cè)的"刪除"按鈕將會出現(xiàn)"日志清理"彈框,彈框中支持選擇不同類型的日志清理策略,選中后點(diǎn)擊"確定"按鈕即可進(jìn)行日志清理操作;?
4.10 刪除任務(wù)
點(diǎn)擊刪除按鈕,可以刪除對應(yīng)任務(wù)。
?
五、總體設(shè)計(jì)
5.1 源碼目錄介紹
- /doc :文檔資料 - /db :“調(diào)度數(shù)據(jù)庫”建表腳本 - /xxl-job-admin :調(diào)度中心,項(xiàng)目源碼 - /xxl-job-core :公共Jar依賴 - /xxl-job-executor-samples :執(zhí)行器,Sample示例項(xiàng)目(大家可以在該項(xiàng)目上進(jìn)行開發(fā),也可以將現(xiàn)有項(xiàng)目改造生成執(zhí)行器項(xiàng)目)5.2 “調(diào)度數(shù)據(jù)庫”配置
XXL-JOB調(diào)度模塊基于Quartz集群實(shí)現(xiàn),其“調(diào)度數(shù)據(jù)庫”是在Quartz的11張集群mysql表基礎(chǔ)上擴(kuò)展而成。
XXL-JOB首先定制了Quartz原生表結(jié)構(gòu)前綴(XXL_JOB_QRTZ_)。
然后,在此基礎(chǔ)上新增了幾張張擴(kuò)展表,如下: - XXL_JOB_QRTZ_TRIGGER_GROUP:執(zhí)行器信息表,維護(hù)任務(wù)執(zhí)行器信息; - XXL_JOB_QRTZ_TRIGGER_REGISTRY:執(zhí)行器注冊表,維護(hù)在線的執(zhí)行器和調(diào)度中心機(jī)器地址信息; - XXL_JOB_QRTZ_TRIGGER_INFO:調(diào)度擴(kuò)展信息表: 用于保存XXL-JOB調(diào)度任務(wù)的擴(kuò)展信息,如任務(wù)分組、任務(wù)名、機(jī)器地址、執(zhí)行器、執(zhí)行入?yún)⒑蛨?bào)警郵件等等; - XXL_JOB_QRTZ_TRIGGER_LOG:調(diào)度日志表: 用于保存XXL-JOB任務(wù)調(diào)度的歷史信息,如調(diào)度結(jié)果、執(zhí)行結(jié)果、調(diào)度入?yún)ⅰ⒄{(diào)度機(jī)器和執(zhí)行器等等; - XXL_JOB_QRTZ_TRIGGER_LOGGLUE:任務(wù)GLUE日志:用于保存GLUE更新歷史,用于支持GLUE的版本回溯功能;
因此,XXL-JOB調(diào)度數(shù)據(jù)庫共計(jì)用于16張數(shù)據(jù)庫表。
5.3 架構(gòu)設(shè)計(jì)
5.3.1 設(shè)計(jì)思想
將調(diào)度行為抽象形成“調(diào)度中心”公共平臺,而平臺自身并不承擔(dān)業(yè)務(wù)邏輯,“調(diào)度中心”負(fù)責(zé)發(fā)起調(diào)度請求。
將任務(wù)抽象成分散的JobHandler,交由“執(zhí)行器”統(tǒng)一管理,“執(zhí)行器”負(fù)責(zé)接收調(diào)度請求并執(zhí)行對應(yīng)的JobHandler中業(yè)務(wù)邏輯。
因此,“調(diào)度”和“任務(wù)”兩部分可以相互解耦,提高系統(tǒng)整體穩(wěn)定性和擴(kuò)展性;
5.3.2 系統(tǒng)組成
- 調(diào)度模塊(調(diào)度中心): 負(fù)責(zé)管理調(diào)度信息,按照調(diào)度配置發(fā)出調(diào)度請求,自身不承擔(dān)業(yè)務(wù)代碼。調(diào)度系統(tǒng)與任務(wù)解耦,提高了系統(tǒng)可用性和穩(wěn)定性,同時(shí)調(diào)度系統(tǒng)性能不再受限于任務(wù)模塊; 支持可視化、簡單且動態(tài)的管理調(diào)度信息,包括任務(wù)新建,更新,刪除,GLUE開發(fā)和任務(wù)報(bào)警等,所有上述操作都會實(shí)時(shí)生效,同時(shí)支持監(jiān)控調(diào)度結(jié)果以及執(zhí)行日志,支持執(zhí)行器Failover。
- 執(zhí)行模塊(執(zhí)行器): 負(fù)責(zé)接收調(diào)度請求并執(zhí)行任務(wù)邏輯。任務(wù)模塊專注于任務(wù)的執(zhí)行等操作,開發(fā)和維護(hù)更加簡單和高效; 接收“調(diào)度中心”的執(zhí)行請求、終止請求和日志請求等。
5.3.3 架構(gòu)圖
5.4 調(diào)度模塊剖析
5.4.1 quartz的不足
Quartz作為開源作業(yè)調(diào)度中的佼佼者,是作業(yè)調(diào)度的首選。但是集群環(huán)境中Quartz采用API的方式對任務(wù)進(jìn)行管理,從而可以避免上述問題,但是同樣存在以下問題:
- 問題一:調(diào)用API的的方式操作任務(wù),不人性化;
- 問題二:需要持久化業(yè)務(wù)QuartzJobBean到底層數(shù)據(jù)表中,系統(tǒng)侵入性相當(dāng)嚴(yán)重。
- 問題三:調(diào)度邏輯和QuartzJobBean耦合在同一個(gè)項(xiàng)目中,這將導(dǎo)致一個(gè)問題,在調(diào)度任務(wù)數(shù)量逐漸增多,同時(shí)調(diào)度任務(wù)邏輯逐漸加重的情況加,此時(shí)調(diào)度系統(tǒng)的性能將大大受限于業(yè)務(wù);
- 問題四:quartz底層以“搶占式”獲取DB鎖并由搶占成功節(jié)點(diǎn)負(fù)責(zé)運(yùn)行任務(wù),會導(dǎo)致節(jié)點(diǎn)負(fù)載懸殊非常大;而XXL-JOB通過執(zhí)行器實(shí)現(xiàn)“協(xié)同分配式”運(yùn)行任務(wù),充分發(fā)揮集群優(yōu)勢,負(fù)載各節(jié)點(diǎn)均衡。
XXL-JOB彌補(bǔ)了quartz的上述不足之處。
5.4.2 RemoteHttpJobBean
常規(guī)Quartz的開發(fā),任務(wù)邏輯一般維護(hù)在QuartzJobBean中,耦合很嚴(yán)重。XXL-JOB中“調(diào)度模塊”和“任務(wù)模塊”完全解耦,調(diào)度模塊中的所有調(diào)度任務(wù)使用同一個(gè)QuartzJobBean,即RemoteHttpJobBean。不同的調(diào)度任務(wù)將各自參數(shù)維護(hù)在各自擴(kuò)展表數(shù)據(jù)中,當(dāng)觸發(fā)RemoteHttpJobBean執(zhí)行時(shí),將會解析不同的任務(wù)參數(shù)發(fā)起遠(yuǎn)程調(diào)用,調(diào)用各自的遠(yuǎn)程執(zhí)行器服務(wù)。
這種調(diào)用模型類似RPC調(diào)用,RemoteHttpJobBean提供調(diào)用代理的功能,而執(zhí)行器提供遠(yuǎn)程服務(wù)的功能。
5.4.3 調(diào)度中心HA(集群)
基于Quartz的集群方案,數(shù)據(jù)庫選用Mysql;集群分布式并發(fā)環(huán)境中使用QUARTZ定時(shí)任務(wù)調(diào)度,會在各個(gè)節(jié)點(diǎn)會上報(bào)任務(wù),存到數(shù)據(jù)庫中,執(zhí)行時(shí)會從數(shù)據(jù)庫中取出觸發(fā)器來執(zhí)行,如果觸發(fā)器的名稱和執(zhí)行時(shí)間相同,則只有一個(gè)節(jié)點(diǎn)去執(zhí)行此任務(wù)。
# 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: 10005.4.4 調(diào)度線程池
調(diào)度采用線程池方式實(shí)現(xiàn),避免單線程因阻塞而引起任務(wù)調(diào)度延遲。
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount: 50 org.quartz.threadPool.threadPriority: 5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true5.4.5 @DisallowConcurrentExecution
XXL-JOB調(diào)度模塊的“調(diào)度中心”默認(rèn)不使用該注解,即默認(rèn)開啟并行機(jī)制,因?yàn)镽emoteHttpJobBean為公共QuartzJobBean,這樣在多線程調(diào)度的情況下,調(diào)度模塊被阻塞的幾率很低,大大提高了調(diào)度系統(tǒng)的承載量。
XXL-JOB的每個(gè)調(diào)度任務(wù)雖然在調(diào)度模塊是并行調(diào)度執(zhí)行的,但是任務(wù)調(diào)度傳遞到任務(wù)模塊的“執(zhí)行器”確實(shí)串行執(zhí)行的,同時(shí)支持任務(wù)終止。
5.4.6 misfire
錯(cuò)過了觸發(fā)時(shí)間,處理規(guī)則。 可能原因:服務(wù)重啟;調(diào)度線程被QuartzJobBean阻塞,線程被耗盡;某個(gè)任務(wù)啟用了@DisallowConcurrentExecution,上次調(diào)度持續(xù)阻塞,下次調(diào)度被錯(cuò)過;
quartz.properties中關(guān)于misfire的閥值配置如下,單位毫秒:
org.quartz.jobStore.misfireThreshold: 60000Misfire規(guī)則: withMisfireHandlingInstructionDoNothing:不觸發(fā)立即執(zhí)行,等待下次調(diào)度; withMisfireHandlingInstructionIgnoreMisfires:以錯(cuò)過的第一個(gè)頻率時(shí)間立刻開始執(zhí)行; withMisfireHandlingInstructionFireAndProceed:以當(dāng)前時(shí)間為觸發(fā)頻率立刻觸發(fā)一次執(zhí)行;
XXL-JOB默認(rèn)misfire規(guī)則為:withMisfireHandlingInstructionDoNothing
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobInfo.getJobCron()).withMisfireHandlingInstructionDoNothing(); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();5.4.7 日志回調(diào)服務(wù)
調(diào)度模塊的“調(diào)度中心”作為Web服務(wù)部署時(shí),一方面承擔(dān)調(diào)度中心功能,另一方面也為執(zhí)行器提供API服務(wù)。
調(diào)度中心提供的"日志回調(diào)服務(wù)API服務(wù)"代碼位置如下:
xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback“執(zhí)行器”在接收到任務(wù)執(zhí)行請求后,執(zhí)行任務(wù),在執(zhí)行結(jié)束之后會將執(zhí)行結(jié)果回調(diào)通知“調(diào)度中心”:
5.4.8 任務(wù)HA(Failover)
執(zhí)行器如若集群部署,調(diào)度中心將會感知到在線的所有執(zhí)行器,如“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”。
當(dāng)任務(wù)"路由策略"選擇"故障轉(zhuǎn)移(FAILOVER)"時(shí),當(dāng)調(diào)度中心每次發(fā)起調(diào)度請求時(shí),會按照順序?qū)?zhí)行器發(fā)出心跳檢測請求,第一個(gè)檢測為存活狀態(tài)的執(zhí)行器將會被選定并發(fā)送調(diào)度請求。
調(diào)度成功后,可在日志監(jiān)控界面查看“調(diào)度備注”,如下;?
“調(diào)度備注”可以看出本地調(diào)度運(yùn)行軌跡,執(zhí)行器的"注冊方式"、"地址列表"和任務(wù)的"路由策略"。"故障轉(zhuǎn)移(FAILOVER)"路由策略下,調(diào)度中心首先對第一個(gè)地址進(jìn)行心跳檢測,心跳失敗因此自動跳過,第二個(gè)依然心跳檢測失敗…… 直至心跳檢測第三個(gè)地址“127.0.0.1:9999”成功,選定為“目標(biāo)執(zhí)行器”;然后對“目標(biāo)執(zhí)行器”發(fā)送調(diào)度請求,調(diào)度流程結(jié)束,等待執(zhí)行器回調(diào)執(zhí)行結(jié)果。
5.4.9 調(diào)度日志
調(diào)度中心每次進(jìn)行任務(wù)調(diào)度,都會記錄一條任務(wù)日志,任務(wù)日志主要包括以下三部分內(nèi)容:
- 任務(wù)信息:包括“執(zhí)行器地址”、“JobHandler”和“執(zhí)行參數(shù)”等屬性,點(diǎn)擊任務(wù)ID按鈕可查看,根據(jù)這些參數(shù),可以精確的定位任務(wù)執(zhí)行的具體機(jī)器和任務(wù)代碼;
- 調(diào)度信息:包括“調(diào)度時(shí)間”、“調(diào)度結(jié)果”和“調(diào)度日志”等,根據(jù)這些參數(shù),可以了解“調(diào)度中心”發(fā)起調(diào)度請求時(shí)具體情況。
- 執(zhí)行信息:包括“執(zhí)行時(shí)間”、“執(zhí)行結(jié)果”和“執(zhí)行日志”等,根據(jù)這些參數(shù),可以了解在“執(zhí)行器”端任務(wù)執(zhí)行的具體情況;
調(diào)度日志,針對單次調(diào)度,屬性說明如下:
- 執(zhí)行器地址:任務(wù)執(zhí)行的機(jī)器地址;
- JobHandler:Bean模式表示任務(wù)執(zhí)行的JobHandler名稱;
- 任務(wù)參數(shù):任務(wù)執(zhí)行的入?yún)?#xff1b;
- 調(diào)度時(shí)間:調(diào)度中心,發(fā)起調(diào)度的時(shí)間;
- 調(diào)度結(jié)果:調(diào)度中心,發(fā)起調(diào)度的結(jié)果,SUCCESS或FAIL;
- 調(diào)度備注:調(diào)度中心,發(fā)起調(diào)度的備注信息,如地址心跳檢測日志等;
- 執(zhí)行時(shí)間:執(zhí)行器,任務(wù)執(zhí)行結(jié)束后回調(diào)的時(shí)間;
- 執(zhí)行結(jié)果:執(zhí)行器,任務(wù)執(zhí)行的結(jié)果,SUCCESS或FAIL;
- 執(zhí)行備注:執(zhí)行器,任務(wù)執(zhí)行的備注信息,如異常日志等;
- 執(zhí)行日志:任務(wù)執(zhí)行過程中,業(yè)務(wù)代碼中打印的完整執(zhí)行日志,見“4.7 查看執(zhí)行日志”;
5.4.10 任務(wù)依賴
原理:XXL-JOB中每個(gè)任務(wù)都對應(yīng)有一個(gè)任務(wù)ID,同時(shí),每個(gè)任務(wù)支持設(shè)置屬性“子任務(wù)ID”,因此,通過“任務(wù)ID”可以匹配任務(wù)依賴關(guān)系。
當(dāng)父任務(wù)執(zhí)行結(jié)束并且執(zhí)行成功時(shí),將會根據(jù)“子任務(wù)ID”匹配子任務(wù)依賴,如果匹配到子任務(wù),將會主動觸發(fā)一次子任務(wù)的執(zhí)行。
在任務(wù)日志界面,點(diǎn)擊任務(wù)的“執(zhí)行備注”的“查看”按鈕,可以看到匹配子任務(wù)以及觸發(fā)子任務(wù)執(zhí)行的日志信息,如無信息則表示未觸發(fā)子任務(wù)執(zhí)行,可參考下圖。
5.4.11 全異步化 & 輕量級
- 全異步化設(shè)計(jì):XXL-JOB系統(tǒng)中業(yè)務(wù)邏輯在遠(yuǎn)程執(zhí)行器執(zhí)行,觸發(fā)流程全異步化設(shè)計(jì)。相比直接在quartz的QuartzJobBean中執(zhí)行業(yè)務(wù)邏輯,極大的降低了調(diào)度線程占用時(shí)間;
- 異步調(diào)度:調(diào)度中心每次任務(wù)觸發(fā)時(shí)僅發(fā)送一次調(diào)度請求,該調(diào)度請求首先推送“異步調(diào)度隊(duì)列”,然后異步推送給遠(yuǎn)程執(zhí)行器
- 異步執(zhí)行:執(zhí)行器會將請求存入“異步執(zhí)行隊(duì)列”并且立即響應(yīng)調(diào)度中心,異步運(yùn)行。
- 輕量級設(shè)計(jì):XXL-JOB調(diào)度中心中每個(gè)JOB邏輯非常 “輕”,在全異步化的基礎(chǔ)上,單個(gè)JOB一次運(yùn)行平均耗時(shí)基本在 "10ms" 之內(nèi)(基本為一次請求的網(wǎng)絡(luò)開銷);因此,可以保證使用有限的線程支撐大量的JOB并發(fā)運(yùn)行;
得益于上述兩點(diǎn)優(yōu)化,理論上默認(rèn)配置下的調(diào)度中心,單機(jī)能夠支撐 5000 任務(wù)并發(fā)運(yùn)行穩(wěn)定運(yùn)行;
實(shí)際場景中,由于調(diào)度中心與執(zhí)行器網(wǎng)絡(luò)ping延遲不同、DB讀寫耗時(shí)不同、任務(wù)調(diào)度密集程度不同,會導(dǎo)致任務(wù)量上限會上下波動。
如若需要支撐更多的任務(wù)量,可以通過 "調(diào)大調(diào)度線程數(shù)" 、"降低調(diào)度中心與執(zhí)行器ping延遲" 和 "提升機(jī)器配置" 幾種方式優(yōu)化。
5.5 任務(wù) "運(yùn)行模式" 剖析
5.5.1 "Bean模式" 任務(wù)
開發(fā)步驟:可參考 "章節(jié)三" ; 原理:每個(gè)Bean模式任務(wù)都是一個(gè)Spring的Bean類實(shí)例,它被維護(hù)在“執(zhí)行器”項(xiàng)目的Spring容器中。任務(wù)類需要加“@JobHandler(value="名稱")”注解,因?yàn)椤皥?zhí)行器”會根據(jù)該注解識別Spring容器中的任務(wù)。任務(wù)類需要繼承統(tǒng)一接口“IJobHandler”,任務(wù)邏輯在execute方法中開發(fā),因?yàn)椤皥?zhí)行器”在接收到調(diào)度中心的調(diào)度請求時(shí),將會調(diào)用“IJobHandler”的execute方法,執(zhí)行任務(wù)邏輯。
5.5.2 "GLUE模式(Java)" 任務(wù)
開發(fā)步驟:可參考 "章節(jié)三" ; 原理:每個(gè) "GLUE模式(Java)" 任務(wù)的代碼,實(shí)際上是“一個(gè)繼承自“IJobHandler”的實(shí)現(xiàn)類的類代碼”,“執(zhí)行器”接收到“調(diào)度中心”的調(diào)度請求時(shí),會通過Groovy類加載器加載此代碼,實(shí)例化成Java對象,同時(shí)注入此代碼中聲明的Spring服務(wù)(請確保Glue代碼中的服務(wù)和類引用在“執(zhí)行器”項(xiàng)目中存在),然后調(diào)用該對象的execute方法,執(zhí)行任務(wù)邏輯。
5.5.3 GLUE模式(Shell) + GLUE模式(Python) + GLUE模式(NodeJS)
開發(fā)步驟:可參考 "章節(jié)三" ; 原理:腳本任務(wù)的源碼托管在調(diào)度中心,腳本邏輯在執(zhí)行器運(yùn)行。當(dāng)觸發(fā)腳本任務(wù)時(shí),執(zhí)行器會加載腳本源碼在執(zhí)行器機(jī)器上生成一份腳本文件,然后通過Java代碼調(diào)用該腳本;并且實(shí)時(shí)將腳本輸出日志寫到任務(wù)日志文件中,從而在調(diào)度中心可以實(shí)時(shí)監(jiān)控腳本運(yùn)行情況;
目前支持的腳本類型如下:
- shell腳本:任務(wù)運(yùn)行模式選擇為 "GLUE模式(Shell)"時(shí)支持 "shell" 腳本任務(wù); - python腳本:任務(wù)運(yùn)行模式選擇為 "GLUE模式(Python)"時(shí)支持 "python" 腳本任務(wù); - nodejs腳本:務(wù)運(yùn)行模式選擇為 "GLUE模式(NodeJS)"時(shí)支持 "nodejs" 腳本任務(wù);腳本任務(wù)通過 Exit Code 判斷任務(wù)執(zhí)行結(jié)果,狀態(tài)碼可參考章節(jié) "5.15 任務(wù)執(zhí)行結(jié)果說明";
5.5.4 執(zhí)行器
執(zhí)行器實(shí)際上是一個(gè)內(nèi)嵌的Jetty服務(wù)器,默認(rèn)端口9999(配置項(xiàng):xxl.job.executor.port)。
在項(xiàng)目啟動時(shí),執(zhí)行器會通過“@JobHandler”識別Spring容器中“Bean模式任務(wù)”,以注解的value屬性為key管理起來。
“執(zhí)行器”接收到“調(diào)度中心”的調(diào)度請求時(shí),如果任務(wù)類型為“Bean模式”,將會匹配Spring容器中的“Bean模式任務(wù)”,然后調(diào)用其execute方法,執(zhí)行任務(wù)邏輯。如果任務(wù)類型為“GLUE模式”,將會加載GLue代碼,實(shí)例化Java對象,注入依賴的Spring服務(wù)(注意:Glue代碼中注入的Spring服務(wù),必須存在與該“執(zhí)行器”項(xiàng)目的Spring容器中),然后調(diào)用execute方法,執(zhí)行任務(wù)邏輯。
5.5.5 任務(wù)日志
XXL-JOB會為每次調(diào)度請求生成一個(gè)單獨(dú)的日志文件,需要通過 "XxlJobLogger.log" 打印執(zhí)行日志,“調(diào)度中心”查看執(zhí)行日志時(shí)將會加載對應(yīng)的日志文件。
(歷史版本通過重寫LOG4J的Appender實(shí)現(xiàn),存在依賴限制,該方式在新版本已經(jīng)被拋棄)
日志文件存放的位置可在“執(zhí)行器”配置文件進(jìn)行自定義,默認(rèn)目錄格式為:/data/applogs/xxl-job/jobhandler/“格式化日期”/“數(shù)據(jù)庫調(diào)度日志記錄的主鍵ID.log”。
在JobHandler中開啟子線程時(shí),子線程將會將會把日志打印在父線程即JobHandler的執(zhí)行日志中,方便日志追蹤。
5.6 通訊模塊剖析
5.6.1 一次完整的任務(wù)調(diào)度通訊流程
- 1、“調(diào)度中心”向“執(zhí)行器”發(fā)送http調(diào)度請求: “執(zhí)行器”中接收請求的服務(wù),實(shí)際上是一臺內(nèi)嵌jetty服務(wù)器,默認(rèn)端口9999; - 2、“執(zhí)行器”執(zhí)行任務(wù)邏輯; - 3、“執(zhí)行器”http回調(diào)“調(diào)度中心”調(diào)度結(jié)果: “調(diào)度中心”中接收回調(diào)的服務(wù),是針對執(zhí)行器開放一套API服務(wù);5.6.2 通訊數(shù)據(jù)加密
調(diào)度中心向執(zhí)行器發(fā)送的調(diào)度請求時(shí)使用RequestModel和ResponseModel兩個(gè)對象封裝調(diào)度請求參數(shù)和響應(yīng)數(shù)據(jù), 在進(jìn)行通訊之前底層會將上述兩個(gè)對象對象序列化,并進(jìn)行數(shù)據(jù)協(xié)議以及時(shí)間戳檢驗(yàn),從而達(dá)到數(shù)據(jù)加密的功能;
5.7 任務(wù)注冊, 任務(wù)自動發(fā)現(xiàn)
自v1.5版本之后, 任務(wù)取消了"任務(wù)執(zhí)行機(jī)器"屬性, 改為通過任務(wù)注冊和自動發(fā)現(xiàn)的方式, 動態(tài)獲取遠(yuǎn)程執(zhí)行器地址并執(zhí)行。
AppName: 每個(gè)執(zhí)行器機(jī)器集群的唯一標(biāo)示, 任務(wù)注冊以 "執(zhí)行器" 為最小粒度進(jìn)行注冊; 每個(gè)任務(wù)通過其綁定的執(zhí)行器可感知對應(yīng)的執(zhí)行器機(jī)器列表; 注冊表: 見"XXL_JOB_QRTZ_TRIGGER_REGISTRY"表, "執(zhí)行器" 在進(jìn)行任務(wù)注冊時(shí)將會周期性維護(hù)一條注冊記錄,即機(jī)器地址和AppName的綁定關(guān)系; "調(diào)度中心" 從而可以動態(tài)感知每個(gè)AppName在線的機(jī)器列表; 執(zhí)行器注冊: 任務(wù)注冊Beat周期默認(rèn)30s; 執(zhí)行器以一倍Beat進(jìn)行執(zhí)行器注冊, 調(diào)度中心以一倍Beat進(jìn)行動態(tài)任務(wù)發(fā)現(xiàn); 注冊信息的失效時(shí)間被三倍Beat; 執(zhí)行器注冊摘除:執(zhí)行器銷毀時(shí),將會主動上報(bào)調(diào)度中心并摘除對應(yīng)的執(zhí)行器機(jī)器信息,提高心跳注冊的實(shí)時(shí)性;為保證系統(tǒng)"輕量級"并且降低學(xué)習(xí)部署成本,沒有采用Zookeeper作為注冊中心,采用DB方式進(jìn)行任務(wù)注冊發(fā)現(xiàn);
5.8 任務(wù)執(zhí)行結(jié)果
自v1.6.2之后,任務(wù)執(zhí)行結(jié)果通過 "IJobHandler" 的返回值 "ReturnT" 進(jìn)行判斷; 當(dāng)返回值符合 "ReturnT.code == ReturnT.SUCCESS_CODE" 時(shí)表示任務(wù)執(zhí)行成功,否則表示任務(wù)執(zhí)行失敗,而且可以通過 "ReturnT.msg" 回調(diào)錯(cuò)誤信息給調(diào)度中心; 從而,在任務(wù)邏輯中可以方便的控制任務(wù)執(zhí)行結(jié)果;
5.9 分片廣播 & 動態(tài)分片
執(zhí)行器集群部署時(shí),任務(wù)路由策略選擇"分片廣播"情況下,一次任務(wù)調(diào)度將會廣播觸發(fā)對應(yīng)集群中所有執(zhí)行器執(zhí)行一次任務(wù),同時(shí)傳遞分片參數(shù);可根據(jù)分片參數(shù)開發(fā)分片任務(wù);
"分片廣播" 以執(zhí)行器為維度進(jìn)行分片,支持動態(tài)擴(kuò)容執(zhí)行器集群從而動態(tài)增加分片數(shù)量,協(xié)同進(jìn)行業(yè)務(wù)處理;在進(jìn)行大數(shù)據(jù)量業(yè)務(wù)操作時(shí)可顯著提升任務(wù)處理能力和速度。
"分片廣播" 和普通任務(wù)開發(fā)流程一致,不同之處在于可以可以獲取分片參數(shù),獲取分片參數(shù)進(jìn)行分片業(yè)務(wù)處理。
- Java語言任務(wù)獲取分片參數(shù)方式:BEAN、GLUE模式(Java)
- 腳本語言任務(wù)獲取分片參數(shù)方式:GLUE模式(Shell)、GLUE模式(Python)、GLUE模式(Nodejs)
分片參數(shù)屬性說明:
index:當(dāng)前分片序號(從0開始),執(zhí)行器集群列表中當(dāng)前執(zhí)行器的序號; total:總分片數(shù),執(zhí)行器集群的總機(jī)器數(shù)量;該特性適用場景如:
- 1、分片任務(wù)場景:10個(gè)執(zhí)行器的集群來處理10w條數(shù)據(jù),每臺機(jī)器只需要處理1w條數(shù)據(jù),耗時(shí)降低10倍;
- 2、廣播任務(wù)場景:廣播執(zhí)行器機(jī)器運(yùn)行shell腳本、廣播集群節(jié)點(diǎn)進(jìn)行緩存更新等
5.10 訪問令牌(AccessToken)
為提升系統(tǒng)安全性,調(diào)度中心和執(zhí)行器進(jìn)行安全性校驗(yàn),雙方AccessToken匹配才允許通訊;
調(diào)度中心和執(zhí)行器,可通過配置項(xiàng) "xxl.job.accessToken" 進(jìn)行AccessToken的設(shè)置。
調(diào)度中心和執(zhí)行器,如果需要正常通訊,只有兩種設(shè)置;
- 設(shè)置一:調(diào)度中心和執(zhí)行器,均不設(shè)置AccessToken;關(guān)閉安全性校驗(yàn);
- 設(shè)置二:調(diào)度中心和執(zhí)行器,設(shè)置了相同的AccessToken;
5.11 調(diào)度中心API服務(wù)
調(diào)度中心提供了API服務(wù),主要分為兩種類型:
5.11.1 提供給執(zhí)行器的API服務(wù):
1、任務(wù)結(jié)果回調(diào)服務(wù); 2、執(zhí)行器注冊服務(wù); 3、執(zhí)行器注冊摘除服務(wù); 4、觸發(fā)任務(wù)單次執(zhí)行服務(wù),支持任務(wù)根據(jù)業(yè)務(wù)事件觸發(fā);API服務(wù)位置:com.xxl.job.core.biz.AdminBiz.java
API服務(wù)請求參考代碼:com.xxl.job.adminbiz.AdminBizTest.java
5.11.2 提供給業(yè)務(wù)的API服務(wù):
1、任務(wù)列表查詢; 2、任務(wù)新增; 3、任務(wù)更新; 4、任務(wù)刪除; 5、任務(wù)暫停; 6、任務(wù)恢復(fù); 7、任務(wù)觸發(fā);API服務(wù)位置:com.xxl.job.admin.controller.JobInfoController.java
API服務(wù)請求參考代碼:可參考任務(wù)界面操作的ajax請求。任何ajax接口均可配置成為API服務(wù),只需在待啟用的API服務(wù)上添加 “@PermessionLimit(limit = false)” 注解取消登陸態(tài)攔截即可;
5.12 執(zhí)行器API服務(wù)
執(zhí)行器提供了API服務(wù),供調(diào)度中心選擇使用,目前提供的API服務(wù)有:
1、心跳檢測 2、忙碌檢測 3、觸發(fā)任務(wù)執(zhí)行 4、獲取Rolling Log 5、終止任務(wù)API服務(wù)位置:com.xxl.job.core.biz.ExecutorBiz
API服務(wù)請求參考代碼:com.xxl.executor.test.DemoJobHandlerTest
5.13 故障轉(zhuǎn)移 & 失敗重試
一次完整任務(wù)流程包括"調(diào)度(調(diào)度中心) + 執(zhí)行(執(zhí)行器)"兩個(gè)階段。
- "故障轉(zhuǎn)移"發(fā)生在調(diào)度階段,在執(zhí)行器集群部署時(shí),如果某一臺執(zhí)行器發(fā)生故障,該策略支持自動進(jìn)行Failover切換到一臺正常的執(zhí)行器機(jī)器并且完成調(diào)度請求流程。
- "失敗重試"發(fā)生在"調(diào)度 + 執(zhí)行"兩個(gè)階段,支持通過自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時(shí)將會按照預(yù)設(shè)的失敗重試次數(shù)主動進(jìn)行重試;
5.14 執(zhí)行器灰度上線
調(diào)度中心與業(yè)務(wù)解耦,只需部署一次后常年不需要維護(hù)。但是,執(zhí)行器中托管運(yùn)行著業(yè)務(wù)作業(yè),作業(yè)上線和變更需要重啟執(zhí)行器,尤其是Bean模式任務(wù)。 執(zhí)行器重啟可能會中斷運(yùn)行中的任務(wù)。但是,XXL-JOB得益于自建執(zhí)行器與自建注冊中心,可以通過灰度上線的方式,避免因重啟導(dǎo)致的任務(wù)中斷的問題。
步驟如下:
- 1、執(zhí)行器改為手動注冊,下線一半機(jī)器列表(A組),線上運(yùn)行另一半機(jī)器列表(B組);
- 2、等待A組機(jī)器任務(wù)運(yùn)行結(jié)束并編譯上線;執(zhí)行器注冊地址替換為A組;
- 3、等待B組機(jī)器任務(wù)運(yùn)行結(jié)束并編譯上線;執(zhí)行器注冊地址替換為A組+B組; 操作結(jié)束;
5.15 任務(wù)執(zhí)行結(jié)果說明
系統(tǒng)根據(jù)以下標(biāo)準(zhǔn)判斷任務(wù)執(zhí)行結(jié)果,可參考之。
| 成功 | IJobHandler.SUCCESS | 0 |
| 失敗 | IJobHandler.FAIL | -1(非0狀態(tài)碼) |
5.16 任務(wù)超時(shí)控制
支持設(shè)置任務(wù)超時(shí)時(shí)間,任務(wù)運(yùn)行超時(shí)的情況下,將會主動中斷任務(wù);
需要注意的是,任務(wù)超時(shí)中斷時(shí)與任務(wù)終止機(jī)制(可查看“4.8 終止運(yùn)行中的任務(wù)”)類似,也是通過 "interrupt" 中斷任務(wù),因此業(yè)務(wù)代碼需要將 "InterruptedException" 外拋,否則功能不可用。
5.17 跨平臺 & 跨語言
跨平臺、跨語言主要體現(xiàn)在以下兩個(gè)方面:
- 1、提供Java、Python、PHP……等十來種任務(wù)模式,可參考章節(jié) “5.5 任務(wù) "運(yùn)行模式" ”;理論上可擴(kuò)展任意語言任務(wù)模式;
- 2、提供基于HTTP的任務(wù)Handler(Bean任務(wù),JobHandler="httpJobHandler");業(yè)務(wù)方只需要提供HTTP鏈接即可,不限制語言、平臺;
5.18 任務(wù)失敗告警
默認(rèn)提供郵件失敗告警,可擴(kuò)展短信、釘釘?shù)确绞?#xff0c;擴(kuò)展代碼位置為 "JobFailMonitorHelper.failAlarm";
5.19 調(diào)度中心Docker鏡像構(gòu)建
可以通過以下命令快速構(gòu)建調(diào)度中心,并啟動運(yùn)行;
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?
六、版本更新日志
6.1 版本 V1.1.x,新特性[2015-12-05]
【于V1.1.x版本,XXL-JOB正式應(yīng)用于我司,內(nèi)部定制別名為 “Ferrari”,新接入應(yīng)用推薦使用最新版本】
- 1、簡單:支持通過Web頁面對任務(wù)進(jìn)行CRUD操作,操作簡單,一分鐘上手;
- 2、動態(tài):支持動態(tài)修改任務(wù)狀態(tài),動態(tài)暫停/恢復(fù)任務(wù),即時(shí)生效;
- 3、服務(wù)HA:任務(wù)信息持久化到mysql中,Job服務(wù)天然支持集群,保證服務(wù)HA;
- 4、任務(wù)HA:某臺Job服務(wù)掛掉,任務(wù)會平滑分配給其他的某一臺存活服務(wù),即使所有服務(wù)掛掉,重啟時(shí)或補(bǔ)償執(zhí)行丟失任務(wù);
- 5、一個(gè)任務(wù)只會在其中一臺服務(wù)器上執(zhí)行;
- 6、任務(wù)串行執(zhí)行;
- 7、支持自定義參數(shù);
- 8、支持遠(yuǎn)程任務(wù)執(zhí)行終止;
6.2 版本 V1.2.x,新特性[2016-01-17]
-
1、支持任務(wù)分組;
-
2、支持“本地任務(wù)”、“遠(yuǎn)程任務(wù)”;
-
3、底層通訊支持兩種方式,Servlet方式 + JETTY方式;
-
4、支持“任務(wù)日志”;
-
5、支持“串行執(zhí)行”,并行執(zhí)行;
說明:V1.2版本將系統(tǒng)架構(gòu)按功能拆分為:
- 調(diào)度模塊(調(diào)度中心):負(fù)責(zé)管理調(diào)度信息,按照調(diào)度配置發(fā)出調(diào)度請求;- 執(zhí)行模塊(執(zhí)行器):負(fù)責(zé)接收調(diào)度請求并執(zhí)行任務(wù)邏輯;- 通訊模塊:負(fù)責(zé)調(diào)度模塊和任務(wù)模塊之間的信息通訊;優(yōu)點(diǎn):
- 解耦:任務(wù)模塊提供任務(wù)接口,調(diào)度模塊維護(hù)調(diào)度信息,業(yè)務(wù)相互獨(dú)立;- 高擴(kuò)展性;- 穩(wěn)定性;
6.3 版本 V1.3.0,新特性[2016-05-19]
-
1、遺棄“本地任務(wù)”模式,推薦使用“遠(yuǎn)程任務(wù)”,易于系統(tǒng)解耦,任務(wù)對應(yīng)的JobHandler統(tǒng)稱為“執(zhí)行器”;
-
2、遺棄“servlet”方式底層系統(tǒng)通訊,推薦使用JETTY方式,調(diào)度+回調(diào)雙向通訊,重構(gòu)通訊邏輯;
-
3、UI交互優(yōu)化:左側(cè)菜單展開狀態(tài)優(yōu)化,菜單項(xiàng)選中狀態(tài)優(yōu)化,任務(wù)列表打開表格有壓縮優(yōu)化;
-
4、【重要】“執(zhí)行器”細(xì)分為:BEAN、GLUE兩種開發(fā)模式,簡介見下文:
“執(zhí)行器” 模式簡介: - BEAN模式執(zhí)行器:每個(gè)執(zhí)行器都是Spring的一個(gè)Bean實(shí)例,XXL-JOB通過注解@JobHandler識別和調(diào)度執(zhí)行器; -GLUE模式執(zhí)行器:每個(gè)執(zhí)行器對應(yīng)一段代碼,在線Web編輯和維護(hù),動態(tài)編譯生效,執(zhí)行器負(fù)責(zé)加載GLUE代碼和執(zhí)行;
6.4 版本 V1.3.1,新特性[2016-05-23]
- 1、更新項(xiàng)目目錄結(jié)構(gòu):
- /xxl-job-admin -------------------- 【調(diào)度中心】:負(fù)責(zé)管理調(diào)度信息,按照調(diào)度配置發(fā)出調(diào)度請求;
- /xxl-job-core ----------------------- 公共依賴
- /xxl-job-executor-example ------ 【執(zhí)行器】:負(fù)責(zé)接收調(diào)度請求并執(zhí)行任務(wù)邏輯;
- /db ---------------------------------- 建表腳本
- /doc --------------------------------- 用戶手冊
- 2、在新的目錄結(jié)構(gòu)上,升級了用戶手冊;
- 3、優(yōu)化了一些交互和UI;
6.5 版本 V1.3.2,新特性[2016-05-28]
- 1、調(diào)度邏輯進(jìn)行事務(wù)包裹;
- 2、執(zhí)行器異步回調(diào)執(zhí)行日志;
- 3、【重要】在 “調(diào)度中心” 支持HA的基礎(chǔ)上,擴(kuò)展執(zhí)行器的Failover支持,支持配置多執(zhí)行期地址;
6.6 版本 V1.4.0 新特性[2016-07-24]
- 1、任務(wù)依賴: 通過事件觸發(fā)方式實(shí)現(xiàn), 任務(wù)執(zhí)行成功并回調(diào)時(shí)會主動觸發(fā)一次子任務(wù)的調(diào)度, 多個(gè)子任務(wù)用逗號分隔;
- 2、執(zhí)行器底層實(shí)現(xiàn)代碼進(jìn)行重度重構(gòu), 優(yōu)化底層建表腳本;
- 3、執(zhí)行器中任務(wù)線程分組邏輯優(yōu)化: 之前根據(jù)執(zhí)行器JobHandler進(jìn)行線程分組,當(dāng)多個(gè)任務(wù)復(fù)用Jobhanlder會導(dǎo)致相互阻塞。現(xiàn)改為根據(jù)調(diào)度中心任務(wù)進(jìn)行任務(wù)線程分組,任務(wù)與任務(wù)執(zhí)行相互隔離;
- 4、執(zhí)行器調(diào)度通訊方案優(yōu)化, 通過Hex + HC實(shí)現(xiàn)建議RPC通訊協(xié)議, 優(yōu)化了通訊參數(shù)的維護(hù)和解析流程;
- 5、調(diào)度中心, 新建/編輯任務(wù), 界面屬性調(diào)整:
- 5.1、任務(wù)新增/編輯界面中去除 "任務(wù)名JobName"屬性 ,該屬性改為系統(tǒng)自動生成: 該字段之前主要用于在 "調(diào)度中心" 唯一標(biāo)示一個(gè)任務(wù), 現(xiàn)實(shí)意義不大, 因此計(jì)劃淡化掉該字段,改為系統(tǒng)生成UUID,從而簡化任務(wù)新建的操作;
- 5.2、任務(wù)新增/編輯界面中去除 "GLUE模式" 復(fù)選框位置調(diào)整, 改為貼近"JobHandler"輸入框右側(cè);
- 5.3、任務(wù)新增/編輯界面中去除 "報(bào)警閾值" 屬性;
- 5.4、任務(wù)新增/編輯界面中去除 "子任務(wù)Key" 屬性, 每個(gè)任務(wù)全局任務(wù)Key可以從任務(wù)列表獲取, 當(dāng)本任務(wù)執(zhí)行結(jié)束且成功后, 將會根據(jù)子任務(wù)Key匹配子任務(wù)并主動觸發(fā)一次子任務(wù)執(zhí)行;
- 6、問題修復(fù):
- 6.1、執(zhí)行器jetty關(guān)閉優(yōu)化,解決一處可能導(dǎo)致jetty無法關(guān)閉的問題;
- 6.2、執(zhí)行器任務(wù)終止時(shí),執(zhí)行隊(duì)列回調(diào)優(yōu)化,解決一處導(dǎo)致任務(wù)無法回調(diào)的問題;
- 6.3、調(diào)度中心中列表分頁參數(shù)優(yōu)化,解決一處因服務(wù)器限制post長度而引起的問題;
- 6.4、執(zhí)行器Jobhandler注解優(yōu)化,解決一處因事務(wù)代理導(dǎo)致的容器無法加載JobHandler的問題;
- 6.5、遠(yuǎn)程調(diào)度優(yōu)化,禁用retry策略,解決一處可能導(dǎo)致重復(fù)調(diào)用的問題;
Tips: 歷史版本(V1.3.x)目前已經(jīng)Release至穩(wěn)定版本, 進(jìn)入維護(hù)階段, 地址見分支?V1.3?。新特性將會在master分支持續(xù)更新。
6.7 版本 V1.4.1 新特性[2016-09-06]
- 1、項(xiàng)目成功推送maven中央倉庫, 中央倉庫地址以及依賴如下: <!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ --> <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>${最新穩(wěn)定版}</version> </dependency>
- 2、為適配中央倉庫規(guī)則, 項(xiàng)目groupId從com.xxl改為com.xuxueli。
- 3、系統(tǒng)版本不在維護(hù)在項(xiàng)目跟pom中,各個(gè)子模塊單獨(dú)配置版本配置,解決子模塊無法單獨(dú)編譯的問題;
- 4、底層RPC通訊,傳輸數(shù)據(jù)的字節(jié)長度統(tǒng)計(jì)規(guī)則優(yōu)化,可節(jié)省50%數(shù)據(jù)傳輸量;
- 5、IJobHandler取消任務(wù)返回值,原通過返回值判斷執(zhí)行狀態(tài),邏輯改為:默認(rèn)任務(wù)執(zhí)行成功,僅在捕獲異常時(shí)認(rèn)定任務(wù)執(zhí)行失敗。
- 6、系統(tǒng)公共彈框功能,插件化;
- 7、底層表結(jié)構(gòu),表明統(tǒng)一大寫;
- 8、調(diào)度中心,異常處理器JSON響應(yīng)的ContentType修改,修復(fù)瀏覽器不識別的問題;
6.8 版本 V1.4.2 新特性[2016-09-29]
- 1、推送新版本 V1.4.2 至中央倉庫, 大版本 V1.4 進(jìn)入維護(hù)階段;
- 2、任務(wù)新增時(shí),任務(wù)列表偏移問題修復(fù);
- 3、修復(fù)一處因bootstrap不支持模態(tài)框重疊而導(dǎo)致的樣式錯(cuò)亂的問題, 在任務(wù)編輯時(shí)會出現(xiàn)該問題;
- 4、調(diào)度超時(shí)和Handler匹配不到時(shí),調(diào)度狀態(tài)優(yōu)化;
- 5、因catch異常,導(dǎo)致任務(wù)不可終止的問題,給出解決方案, 見文檔;
6.9 版本 V1.5.0 特性[2016-11-13]
- 1、任務(wù)注冊: 執(zhí)行器會周期性自動注冊任務(wù), 調(diào)度中心將會自動發(fā)現(xiàn)注冊的任務(wù)并觸發(fā)執(zhí)行。
- 2、"執(zhí)行器" 新增參數(shù) "AppName" : 是每個(gè)執(zhí)行器集群的唯一標(biāo)示AppName, 并周期性以AppName為對象進(jìn)行自動注冊。
- 3、調(diào)度中心新增欄目 "執(zhí)行器管理" : 管理在線的執(zhí)行器, 通過屬性AppName自動發(fā)現(xiàn)注冊的執(zhí)行器。只有被管理的執(zhí)行器才允許被使用;
- 4、"任務(wù)組"屬性改為"執(zhí)行器": 每個(gè)任務(wù)需要綁定指定的執(zhí)行器, 調(diào)度地址通過綁定的執(zhí)行器獲取;
- 5、拋棄"任務(wù)機(jī)器"屬性: 通過任務(wù)綁定的執(zhí)行器, 自動發(fā)現(xiàn)注冊的遠(yuǎn)程執(zhí)行器地址并觸發(fā)調(diào)度請求。
- 6、"公共依賴"中新增DBGlueLoader,基于原生jdbc實(shí)現(xiàn)GLUE源碼的加載器,減少第三方依賴(mybatis,spring-orm等);精簡和優(yōu)化執(zhí)行器測配置(針對GLUE任務(wù)),降低上手難度;
- 7、表結(jié)構(gòu)調(diào)整,底層重構(gòu)優(yōu)化;
- 8、"調(diào)度中心"自動注冊和發(fā)現(xiàn),failover: 調(diào)度中心周期性自動注冊, 任務(wù)回調(diào)時(shí)可以感知在線的所有調(diào)度中心地址, 通過failover的方式進(jìn)行任務(wù)回調(diào),避免回調(diào)單點(diǎn)風(fēng)險(xiǎn)。
6.10 版本 V1.5.1 特性[2016-11-13]
- 1、底層代碼重構(gòu)和邏輯優(yōu)化,POM清理以及CleanCode;
- 2、Servlet/JSP Spec設(shè)定為3.0/2.2
- 3、Spring升級至3.2.17.RELEASE版本;
- 4、Jetty升級版本至8.2.0.v20160908;
- 5、已推送V1.5.0和V1.5.1至Maven中央倉庫;
6.10 版本 V1.5.2 特性[2017-02-28]
- 1、IP工具類獲取IP邏輯優(yōu)化,IP靜態(tài)緩存;
- 2、執(zhí)行器、調(diào)度中心,均支持自定義注冊IP地址;解決機(jī)器多網(wǎng)卡時(shí)錯(cuò)誤網(wǎng)卡注冊的情況;
- 3、任務(wù)跨天執(zhí)行時(shí)生成多份日志文件的問題修復(fù);
- 4、底層日志底層日志調(diào)整,非敏感日志level調(diào)整為debug;
- 5、升級數(shù)據(jù)庫連接池c3p0版本;
- 6、執(zhí)行器log4j配置優(yōu)化,去除無效屬性;
- 7、底層代碼重構(gòu)和邏輯優(yōu)化以及CleanCode;
- 8、GLUE依賴注入邏輯優(yōu)化,支持別名注入;
6.11 版本 V1.6.0 特性[2017-03-13]
- 1、通訊方案升級,原基于HEX的通訊模型調(diào)整為基于HTTP的B-RPC的通訊模型;
- 2、執(zhí)行器支持手動設(shè)置執(zhí)行地址列表,提供開關(guān)切換使用注冊地址還是手動設(shè)置的地址;
- 3、執(zhí)行器路由規(guī)則:第一個(gè)、最后一個(gè)、輪詢、隨機(jī)、一致性HASH、最不經(jīng)常使用、最近最久未使用、故障轉(zhuǎn)移;
- 4、規(guī)范線程模型統(tǒng)一,統(tǒng)一線程銷毀方案(通過listener或stop方法,容器銷毀時(shí)銷毀線程;Daemon方式有時(shí)不太理想);
- 5、規(guī)范系統(tǒng)配置數(shù)據(jù),通過配置文件統(tǒng)一管理;
- 6、CleanCode,清理無效的歷史參數(shù);
- 7、底層擴(kuò)展數(shù)據(jù)結(jié)構(gòu)以及相關(guān)表結(jié)構(gòu)調(diào)整;
- 8、新建任務(wù)默認(rèn)為非運(yùn)行狀態(tài);
- 9、GLUE模式任務(wù)實(shí)例更新邏輯優(yōu)化,原根據(jù)超時(shí)時(shí)間更新改為根據(jù)版本號更新,源碼變動版本號加一;
6.12 版本 V1.6.1 特性[2017-03-25]
- 1、Rolling日志;
- 2、WebIDE交互重構(gòu);
- 3、通訊增強(qiáng)校驗(yàn),有效過濾非正常請求;
- 4、權(quán)限增強(qiáng)校驗(yàn),采用動態(tài)登錄TOKEN(推薦接入內(nèi)部SSO);
- 5、數(shù)據(jù)庫配置優(yōu)化,解決亂碼問題;
6.13 版本 V1.6.2 特性[2017-04-25]
- 1、運(yùn)行報(bào)表:支持實(shí)時(shí)查看運(yùn)行數(shù)據(jù),如任務(wù)數(shù)量、調(diào)度次數(shù)、執(zhí)行器數(shù)量等;以及調(diào)度報(bào)表,如調(diào)度日期分布圖,調(diào)度成功分布圖等;
- 2、JobHandler支持設(shè)置任務(wù)返回值,在任務(wù)邏輯中可以方便的控制任務(wù)執(zhí)行結(jié)果;
- 3、資源路徑包含空格或中文時(shí)資源文件無法加載時(shí),無法準(zhǔn)確查看異常信息的問題處理。
- 4、路由策越優(yōu)化:循環(huán)和LFU路由策略計(jì)數(shù)器自增無上限問題和首次路由壓力集中在首臺機(jī)器的問題修復(fù);
6.14 版本 V1.7.0 特性[2017-05-02]
- 1、腳本任務(wù):支持以GLUE模式開發(fā)和運(yùn)行腳本任務(wù),包括Shell、Python和Groovy等類型腳本;
- 2、新增spring-boot類型執(zhí)行器example項(xiàng)目;
- 3、升級jetty版本至9.2;
- 4、任務(wù)運(yùn)行日志移除log4j組件依賴,改為底層自主實(shí)現(xiàn),從而取消了對日志組件的依賴限制;
- 5、執(zhí)行器移除GlueLoader依賴,改為推送方式實(shí)現(xiàn),從而GLUE源碼加載不再依賴JDBC;
- 6、登錄攔截Redirect時(shí)獲取項(xiàng)目名,解決非根據(jù)目錄發(fā)布時(shí)跳轉(zhuǎn)404問題;
6.15 版本 V1.7.1 特性[2017-05-08]
- 1、運(yùn)行日志讀寫編碼統(tǒng)一為UTF-8,解決windows環(huán)境下日志亂碼問題;
- 2、通訊超時(shí)時(shí)間限定為10s,避免異常情況下調(diào)度線程占用;
- 3、執(zhí)行器,server啟動、銷毀和注冊邏輯調(diào)整;
- 4、JettyServer關(guān)閉邏輯優(yōu)化,修復(fù)執(zhí)行器無法正常關(guān)閉導(dǎo)致端口占用和頻繁打印c3p0日志的問題;
- 5、JobHandler中開啟子線程時(shí),支持子線程輸出執(zhí)行日志并通過Rolling查看。
- 6、任務(wù)日志清理功能;
- 7、彈框組件統(tǒng)一替換為layer;
- 8、升級quartz版本至2.3.0;
6.16 版本 V1.7.2 特性[2017-05-17]
- 1、阻塞處理策略:調(diào)度過于密集執(zhí)行器來不及處理時(shí)的處理策略,策略包括:單機(jī)串行(默認(rèn))、丟棄后續(xù)調(diào)度、覆蓋之前調(diào)度;
- 2、失敗處理策略;調(diào)度失敗時(shí)的處理策略,策略包括:失敗告警(默認(rèn))、失敗重試;
- 3、通訊時(shí)間戳超時(shí)時(shí)間調(diào)整為180s;
- 4、執(zhí)行器與數(shù)據(jù)庫徹底解耦,但是執(zhí)行器需要配置調(diào)度中心集群地址。調(diào)度中心提供API供執(zhí)行器回調(diào)和心跳注冊服務(wù),取消調(diào)度中心內(nèi)部jetty,心跳周期調(diào)整為30s,心跳失效為三倍心跳;
- 5、執(zhí)行參數(shù)編輯時(shí)丟失問題修復(fù);
- 6、新增任務(wù)測試Demo,方便在開發(fā)時(shí)進(jìn)行任務(wù)邏輯測試;
6.17 版本 V1.8.0 特性[2017-07-17]
- 1、任務(wù)Cron更新邏輯優(yōu)化,改為rescheduleJob,同時(shí)防止cron重復(fù)設(shè)置;
- 2、API回調(diào)服務(wù)失敗狀態(tài)碼優(yōu)化,方便問題排查;
- 3、XxlJobLogger的日志多參數(shù)支持;
- 4、路由策略新增 "忙碌轉(zhuǎn)移" 模式:按照順序依次進(jìn)行空閑檢測,第一個(gè)空閑檢測成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;
- 5、路由策略代碼重構(gòu);
- 6、執(zhí)行器重復(fù)注冊問題修復(fù);
- 7、任務(wù)線程輪空30次后自動銷毀,降低低頻任務(wù)的無效線程消耗。
- 8、執(zhí)行器任務(wù)執(zhí)行結(jié)果批量回調(diào),降低回調(diào)頻率提升執(zhí)行器性能;
- 9、springboot版本執(zhí)行器,取消XML配置,改為類配置方式;
- 10、執(zhí)行日志,支持根據(jù)運(yùn)行 "狀態(tài)" 篩選日志;
- 11、調(diào)度中心任務(wù)注冊檢測邏輯優(yōu)化;
6.18 版本 V1.8.1 特性[2017-07-30]
- 1、分片廣播任務(wù):執(zhí)行器集群部署時(shí),任務(wù)路由策略選擇"分片廣播"情況下,一次任務(wù)調(diào)度將會廣播觸發(fā)集群中所有執(zhí)行器執(zhí)行一次任務(wù),可根據(jù)分片參數(shù)處理分片任務(wù);
- 2、動態(tài)分片:分片廣播任務(wù)以執(zhí)行器為維度進(jìn)行分片,支持動態(tài)擴(kuò)容執(zhí)行器集群從而動態(tài)增加分片數(shù)量,協(xié)同進(jìn)行業(yè)務(wù)處理;在進(jìn)行大數(shù)據(jù)量業(yè)務(wù)操作時(shí)可顯著提升任務(wù)處理能力和速度。
- 3、執(zhí)行器JobHandler禁止命名沖突;
- 4、執(zhí)行器集群地址列表進(jìn)行自然排序;
- 5、調(diào)度中心,DAO層代碼精簡優(yōu)化并且新增測試用例覆蓋;
- 6、調(diào)度中心API服務(wù)改為自研RPC形式,統(tǒng)一底層通訊模型;
- 7、新增調(diào)度中心API服務(wù)測試Demo,方便在調(diào)度中心API擴(kuò)展和測試;
- 8、任務(wù)列表頁交互優(yōu)化,更換執(zhí)行器分組時(shí)自動刷新任務(wù)列表,新建任務(wù)時(shí)默認(rèn)定位在當(dāng)前執(zhí)行器位置;
- 9、訪問令牌(accessToken):為提升系統(tǒng)安全性,調(diào)度中心和執(zhí)行器進(jìn)行安全性校驗(yàn),雙方AccessToken匹配才允許通訊;
- 10、springboot版本執(zhí)行器,升級至1.5.6.RELEASE版本;
- 11、統(tǒng)一maven依賴版本管理;
6.19 版本 V1.8.2 特性[2017-09-04]
- 1、項(xiàng)目主頁搭建:提供中英文文檔:http://www.xuxueli.com/xxl-job
- 2、JFinal執(zhí)行器Sample示例項(xiàng)目;
- 3、事件觸發(fā):除了"Cron方式"和"任務(wù)依賴方式"觸發(fā)任務(wù)執(zhí)行之外,支持基于事件的觸發(fā)任務(wù)方式。調(diào)度中心提供觸發(fā)任務(wù)單次執(zhí)行的API服務(wù),可根據(jù)業(yè)務(wù)事件靈活觸發(fā)。
- 4、執(zhí)行器摘除:執(zhí)行器銷毀時(shí),主動通知調(diào)度中心并摘除對應(yīng)執(zhí)行器節(jié)點(diǎn),提高執(zhí)行器狀態(tài)感知的時(shí)效性。
- 5、執(zhí)行器手動設(shè)置IP時(shí)將會綁定Host;
- 6、規(guī)范項(xiàng)目目錄,方便擴(kuò)展多執(zhí)行器;
- 7、解決執(zhí)行器回調(diào)URL不支持配置HTTPS時(shí)問題;
- 8、執(zhí)行器回調(diào)線程銷毀前, 批量回調(diào)隊(duì)列中數(shù)據(jù),防止任務(wù)結(jié)果丟失;
- 9、調(diào)度中心任務(wù)監(jiān)控線程銷毀時(shí),批量對失敗任務(wù)告警,防止告警信息丟失;
- 10、任務(wù)日志文件路徑時(shí)間戳格式化時(shí)SimpleDateFormat并發(fā)問題解決;
6.20 版本 V1.9.0 特性[2017-12-29]
- 1、新增Nutz執(zhí)行器Sample示例項(xiàng)目;
- 2、新增任務(wù)運(yùn)行模式 "GLUE模式(NodeJS) ",支持NodeJS腳本任務(wù);
- 3、腳本任務(wù)Shell、Python和Nodejs等支持獲取分片參數(shù);
- 4、失敗重試,完整支持:調(diào)度中心調(diào)度失敗且啟用"失敗重試"策略時(shí),將會自動重試一次;執(zhí)行器執(zhí)行失敗且回調(diào)失敗重試狀態(tài)(新增失敗重試狀態(tài)返回值)時(shí),也將會自動重試一次;
- 5、失敗告警策略擴(kuò)展:默認(rèn)提供郵件失敗告警,可擴(kuò)展短信等,擴(kuò)展代碼位置為 "JobFailMonitorHelper.failAlarm";
- 6、執(zhí)行器端口支持自動生成(小于等于0時(shí)),避免端口定義沖突;
- 7、調(diào)度報(bào)表優(yōu)化,支持時(shí)間區(qū)間篩選;
- 8、Log組件支持輸出異常棧信息,底層實(shí)現(xiàn)優(yōu)化;
- 9、告警郵件樣式優(yōu)化,調(diào)整為表格形式,郵件組件調(diào)整為commons-email簡化郵件操作;
- 10、項(xiàng)目依賴全量升級至較新穩(wěn)定版本,如spring、jackson等等;
- 11、任務(wù)日志,記錄發(fā)起調(diào)度的機(jī)器信息;
- 12、交互優(yōu)化,如登陸注銷;
- 13、任務(wù)Cron長度擴(kuò)展支持至128位,支持負(fù)責(zé)類型Cron設(shè)置;
- 14、執(zhí)行器地址錄入交互優(yōu)化,地址長度擴(kuò)展支持至512位,支持大規(guī)模執(zhí)行器集群配置;
- 15、任務(wù)參數(shù)“IJobHandler.execute”入?yún)⒏臑椤癝tring params”,增強(qiáng)入?yún)⑼ㄓ眯浴?/li>
- 16、IJobHandler提供init/destroy方法,支持在相應(yīng)任務(wù)線程初始化和銷毀時(shí)進(jìn)行附加操作;
- 17、任務(wù)注解調(diào)整為 “@JobHandler”,與任務(wù)抽象接口統(tǒng)一;
- 18、修復(fù)任務(wù)監(jiān)控線程被耗時(shí)任務(wù)阻塞的問題;
- 19、修復(fù)任務(wù)監(jiān)控線程無法監(jiān)控任務(wù)觸發(fā)和執(zhí)行狀態(tài)均未0的問題;
- 20、執(zhí)行器動態(tài)代理對象,攔截非業(yè)務(wù)方法的執(zhí)行;
- 21、修復(fù)JobThread捕獲Error錯(cuò)誤不更新JobLog的問題;
- 22、修復(fù)任務(wù)列表界面左側(cè)菜單合并時(shí)樣式錯(cuò)亂問題;
- 23、調(diào)度中心項(xiàng)目日志配置改為xml文件格式;
- 24、Log地址格式兼容,支持非"/"結(jié)尾路徑配置;
- 25、底層系統(tǒng)日志級別規(guī)范調(diào)整,清理遺留代碼;
- 26、建表SQL優(yōu)化,支持同步創(chuàng)建制定編碼的庫和表;
- 27、系統(tǒng)安全性優(yōu)化,登陸Token寫Cookie時(shí)進(jìn)行MD5加密,同時(shí)Cookie啟用HttpOnly;
- 28、新增"任務(wù)ID"屬性,移除"JobKey"屬性,前者承擔(dān)所有功能,方便后續(xù)增強(qiáng)任務(wù)依賴功能。
- 29、任務(wù)循環(huán)依賴問題修復(fù),避免子任務(wù)與父任務(wù)重復(fù)導(dǎo)致的調(diào)度死循環(huán);
- 30、任務(wù)列表新增篩選條件 "任務(wù)描述",快速檢索任務(wù);
- 31、執(zhí)行器Log文件定期清理功能:執(zhí)行器新增配置項(xiàng)("xxl.job.executor.logretentiondays")日志保存天數(shù),日志文件過期自動刪除。
6.21 版本 V1.9.1 特性[2018-02-22]
- 1、國際化:調(diào)度中心實(shí)現(xiàn)國際化,支持中文、英文兩種語言,默認(rèn)為中文。
- 2、調(diào)度報(bào)表新增"運(yùn)行中"中狀態(tài)項(xiàng);
- 3、調(diào)度報(bào)表優(yōu)化,報(bào)表SQL調(diào)優(yōu)并且新增LocalCache緩存(緩存時(shí)間60s),提高大數(shù)據(jù)量下報(bào)表加載速度;
- 4、修復(fù)打包部署時(shí)資源文件亂碼問題;
- 5、修復(fù)新版本chrome滾動到頂部失效問題;
- 6、調(diào)度中心配置加載優(yōu)化,取消對配置文件名的強(qiáng)依賴,支持加載磁盤配置;
- 7、修復(fù)腳本任務(wù)Log文件未正常close的問題;
- 8、項(xiàng)目依賴全量升級至較新穩(wěn)定版本,如spring、jackson等等;
6.22 版本 V1.9.2 特性[2018-10-05]
- 1、任務(wù)超時(shí)控制:新增任務(wù)屬性 "任務(wù)超時(shí)時(shí)間",并支持自定義,任務(wù)運(yùn)行超時(shí)將會主動中斷任務(wù);
- 2、任務(wù)失敗重試次數(shù):新增任務(wù)屬性 "失敗重試次數(shù)",并支持自定義,當(dāng)任務(wù)失敗時(shí)將會按照預(yù)設(shè)的失敗重試次數(shù)主動進(jìn)行重試;同時(shí)收斂廢棄其他失敗重試策略,如調(diào)度失敗、執(zhí)行失敗、狀態(tài)碼失敗等;
- 3、新增任務(wù)運(yùn)行模式 "GLUE模式(PHP) ",支持php腳本任務(wù);
- 4、新增任務(wù)運(yùn)行模式 "GLUE模式(PowerShell) ",支持PowerShell腳本任務(wù);
- 5、調(diào)度全異步處理:任務(wù)觸發(fā)之后,推送到調(diào)度隊(duì)列,多線程并發(fā)處理調(diào)度請求,提高任務(wù)調(diào)度速率的同時(shí),避免因網(wǎng)絡(luò)問題導(dǎo)致quartz調(diào)度線程阻塞的問題;
- 6、執(zhí)行器任務(wù)結(jié)果落盤優(yōu)化:執(zhí)行器回調(diào)失敗時(shí)將任務(wù)結(jié)果寫磁盤,待重啟或網(wǎng)絡(luò)恢復(fù)時(shí)重試回調(diào)任務(wù)結(jié)果,防止任務(wù)執(zhí)行結(jié)果丟失;
- 7、任務(wù)日志查詢速度大幅提升:百萬級別數(shù)據(jù)量搜索速度提升1000倍;
- 8、調(diào)度中心提供API服務(wù),支持通過API服務(wù)對任務(wù)進(jìn)行查詢、新增、更新、啟停等操作;
- 9、底層自研Log組件參數(shù)占位符改為"{}",并修復(fù)打印有參日志時(shí)參數(shù)不匹配導(dǎo)致報(bào)錯(cuò)的問題;
- 10、任務(wù)回調(diào)結(jié)果優(yōu)化,支持展示在Rolling log中,方便問題排查;
- 11、底層LocalCache組件兼容性優(yōu)化,支持jdk9、jdk10及以上版本編譯部署;
- 12、告警郵件固定使用 UTF-8 編碼格式,修復(fù)由機(jī)器編碼導(dǎo)致的郵件亂碼問題;
- 13、告警郵件中展示失敗告警信息;
- 14、告警郵箱支持SSL配置;
- 15、Window機(jī)器下File.separator不兼容問題修復(fù);
- 16、腳本任務(wù)異常Log輸出優(yōu)化;
- 17、任務(wù)線程停止變量修飾符優(yōu)化;
- 18、腳本任務(wù)Log文件流關(guān)閉優(yōu)化;
- 19、任務(wù)報(bào)表成功、失敗和進(jìn)行中統(tǒng)計(jì)問題修復(fù);
- 20、核心依賴Core內(nèi)部國際化處理;
- 21、默認(rèn)Quartz線程數(shù)調(diào)整為50;
- 22、新增左側(cè)菜單"運(yùn)行報(bào)表";
- 23、執(zhí)行器手動設(shè)置IP時(shí)取消綁定Host的操作,該IP僅供執(zhí)行器注冊使用;修復(fù)指定外網(wǎng)IP時(shí)無法綁定執(zhí)行器Host的問題;
- 24、取消父子任務(wù)不可重復(fù)的限制,支持循環(huán)任務(wù)觸發(fā)等特殊場景;
- 25、任務(wù)調(diào)度備注中標(biāo)注任務(wù)觸發(fā)類型,如Cron觸發(fā)、父任務(wù)觸發(fā)、API觸發(fā)等等,方便排查調(diào)度日志;
- 26、底層日志組件SimpleDateFormat線程安全問題修復(fù);
- 27、執(zhí)行器通訊線程優(yōu)化,corePoolSize從256降低至32;
- 28、任務(wù)日志表狀態(tài)字段類型優(yōu)化;
- 29、GLUE腳本文件自動清理功能,及時(shí)清理過期腳本文件;
- 30、執(zhí)行器注冊方式切換優(yōu)化,切換自動注冊時(shí)主動同步在線機(jī)器,避免執(zhí)行器為空的問題;
- 31、跨平臺:除了提供Java、Python、PHP等十來種任務(wù)模式之外,新增提供基于HTTP的任務(wù)模式;
- 32、底層RPC序列化協(xié)議調(diào)整為hessian2;
- 33、修復(fù)表字段 “t.order”與數(shù)據(jù)庫關(guān)鍵字沖突查詢失敗的問題,
- 34、任務(wù)屬性枚舉 "任務(wù)模式、阻塞策略" 國際化優(yōu)化;
- 35、分片任務(wù)失敗重試優(yōu)化,僅重試當(dāng)前失敗的分片;
- 36、任務(wù)觸發(fā)時(shí)支持動態(tài)傳參,調(diào)度中心與API服務(wù)均提供提供動態(tài)參數(shù)功能;
- 37、任務(wù)執(zhí)行日志、調(diào)度日志字段類型調(diào)整,改為text類型并取消字?jǐn)?shù)限制;
- 38、GLUE任務(wù)腳本字段類型調(diào)整,改為mediumtext類型,提高GLUE長度上限;
- 39、任務(wù)監(jiān)控線程Log輸出優(yōu)化,運(yùn)行中任務(wù)的監(jiān)控Log改為debug級別,減少非核心日志量;
- 40、項(xiàng)目依賴全量升級至較新穩(wěn)定版本,如spring、Jackson、groovy等等;
- 41、docker支持:調(diào)度中心提供 Dockerfile 方便快速構(gòu)建docker鏡像;
6.23 版本 V2.0.0 特性[迭代中]
- 1、[迭代中]調(diào)度中心遷移到springboot;
- 2、[迭代中]SimpleTrigger 支持;
- 3、[迭代中]任務(wù)狀態(tài)與quartz解耦,降低quartz調(diào)度壓力,僅NORMAL狀態(tài)任務(wù)綁定quartz;
- 4、[迭代中]新增任務(wù)默認(rèn)運(yùn)行狀態(tài),任務(wù)更新時(shí)運(yùn)行狀態(tài)保持不變;
- 5、[迭代中]任務(wù)權(quán)限管理:執(zhí)行器為粒度分配權(quán)限,核心操作校驗(yàn)權(quán)限;
- 6、[迭代中]Release發(fā)布時(shí),一同發(fā)布調(diào)度中心安裝包,真正實(shí)現(xiàn)開箱即用;
- 7、[迭代中]docker鏡像,并且推送docker鏡像到中央倉庫,更進(jìn)一步實(shí)現(xiàn)產(chǎn)品開箱即用;
TODO LIST
- 1、任務(wù)分片路由:分片采用一致性Hash算法計(jì)算出盡量穩(wěn)定的分片順序,即使注冊機(jī)器存在波動也不會引起分批分片順序大的波動;目前采用IP自然排序,可以滿足需求,待定;
- 2、任務(wù)單機(jī)多線程:提升任務(wù)單機(jī)并行處理能力;
- 3、任務(wù)依賴,流程圖,子任務(wù)+會簽任務(wù),各節(jié)點(diǎn)日志;
- 4、調(diào)度任務(wù)優(yōu)先級;
- 5、移除quartz依賴,重寫調(diào)度模塊:新增或恢復(fù)任務(wù)時(shí)將下次執(zhí)行記錄插入delayqueue,調(diào)度中心集群競爭分布式鎖,成功節(jié)點(diǎn)批量加載到期delayqueue數(shù)據(jù),批量執(zhí)行。
- 6、多數(shù)據(jù)庫支持,在重寫并移除Quartz的基礎(chǔ)上,DAO層通過JPA實(shí)現(xiàn),不限制數(shù)據(jù)庫類型;
- 7、執(zhí)行器Log清理功能:調(diào)度中心Log刪除時(shí)同步刪除執(zhí)行器中的Log文件;
- 8、Bean模式任務(wù),JobHandler自動從執(zhí)行器中查詢展示為下拉框,選擇后自動填充任務(wù)名稱等屬性;
- 9、API事件觸發(fā)類型任務(wù)(更類似MQ消息)支持"動態(tài)傳參、延時(shí)消費(fèi)";該類型任務(wù)不走Quartz,單獨(dú)建立MQ消息表,調(diào)度中心競爭觸發(fā);待定,該功能與 XXL-MQ 沖突,該場景建議用后者;
- 10、調(diào)度線程池改為協(xié)程方式實(shí)現(xiàn),大幅降低系統(tǒng)內(nèi)存消耗;
- 11、任務(wù)依賴增強(qiáng),新增任務(wù)類型 "流程任務(wù)",流程節(jié)點(diǎn)可掛載普通類型任務(wù),承擔(dān)任務(wù)依賴功能。現(xiàn)有子任務(wù)模型取消;需要考慮任務(wù)依賴死循環(huán)問題;
- 12、任務(wù)告警邏輯調(diào)整:任務(wù)調(diào)度,以及任務(wù)回調(diào)失敗時(shí),均推送監(jiān)控隊(duì)列。后期考慮通過任務(wù)Log字段控制告警狀態(tài);
- 13、提供多版本執(zhí)行器:不依賴容器版本、不內(nèi)嵌Jetty版本(通過配置executoraddress替換jetty通訊)等;
- 14、注冊中心支持?jǐn)U展,除默認(rèn)基于DB之外,支持?jǐn)U展接入第三方注冊中心如zk、eureka等;
- 15、流程任務(wù),支持參數(shù)傳遞;
- 16、Cron TimeZone 自定義;
- 17、忙碌轉(zhuǎn)移優(yōu)化,全部機(jī)器忙碌時(shí)不再直接失敗;
- 18、流程任務(wù)等,透傳動態(tài)參數(shù);
- 19、任務(wù)支持切換執(zhí)行器;
- 20、任務(wù)自動注冊;待考慮,因?yàn)槿蝿?wù)自動注冊將會導(dǎo)致任務(wù)難以管理控制;
?
七、其他
7.1 項(xiàng)目貢獻(xiàn)
歡迎參與項(xiàng)目貢獻(xiàn)!比如提交PR修復(fù)一個(gè)bug,或者新建?Issue?討論新特性或者變更。
7.2 用戶接入登記
更多接入的公司,歡迎在?登記地址?登記,登記僅僅為了產(chǎn)品推廣。
7.3 開源協(xié)議和版權(quán)
產(chǎn)品開源免費(fèi),并且將持續(xù)提供免費(fèi)的社區(qū)技術(shù)支持。個(gè)人或企業(yè)內(nèi)部可自由的接入和使用。
- Licensed under the GNU General Public License (GPL) v3.
- Copyright (c) 2015-present, xuxueli.
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的轻量级分布式任务调度平台 XXL-JOB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python异步非阻塞IO多路复用Sel
- 下一篇: Linux 源码安装 Python3 和