XXL-JOB是一個分布式任務調(diào)度平臺,其核心設計目標是開發(fā)迅速、學習簡單、輕量級、易擴展。現(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用
xxl是xxl-job的開發(fā)者大眾點評的【許雪里】名稱的拼音開頭
官網(wǎng)地址
分布式任務調(diào)度平臺XXL-JOB
文檔地址
- 中文文檔
- English Documentation
源碼倉庫地址
源碼倉庫地址 | Release Download |
---|---|
GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任務調(diào)度平臺XXL-JOB) | Download |
xxl-job: 一個分布式任務調(diào)度平臺,其核心設計目標是開發(fā)迅速、學習簡單、輕量級、易擴展?,F(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用。 | 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>
一、總體設計
(一)源碼目錄介紹
- /doc :文檔資料
- /db :“調(diào)度數(shù)據(jù)庫”建表腳本
- /xxl-job-admin :調(diào)度中心,項目源碼
- /xxl-job-core :公共Jar依賴
- /xxl-job-executor-samples :執(zhí)行器,Sample示例項目(大家可以在該項目上進行開發(fā),也可以將現(xiàn)有項目改造生成執(zhí)行器項目)
(二)“調(diào)度數(shù)據(jù)庫”配置
XXL-JOB調(diào)度模塊基于自研調(diào)度組件并支持集群部署,調(diào)度數(shù)據(jù)庫表說明如下:
- xxl_job_lock:任務調(diào)度鎖表;
- xxl_job_group:執(zhí)行器信息表,維護任務執(zhí)行器信息;
- xxl_job_info:調(diào)度擴展信息表: 用于保存XXL-JOB調(diào)度任務的擴展信息,如任務分組、任務名、機器地址、執(zhí)行器、執(zhí)行入?yún)⒑蛨缶]件等等;
- xxl_job_log:調(diào)度日志表: 用于保存XXL-JOB任務調(diào)度的歷史信息,如調(diào)度結(jié)果、執(zhí)行結(jié)果、調(diào)度入?yún)ⅰ⒄{(diào)度機器和執(zhí)行器等等;
- xxl_job_log_report:調(diào)度日志報表:用戶存儲XXL-JOB任務調(diào)度日志的報表,調(diào)度中心報表功能頁面會用到;
- xxl_job_logglue:任務GLUE日志:用于保存GLUE更新歷史,用于支持GLUE的版本回溯功能;
- xxl_job_registry:執(zhí)行器注冊表,維護在線的執(zhí)行器和調(diào)度中心機器地址信息;
- xxl_job_user:系統(tǒng)用戶表;
(三)架構(gòu)設計
1、設計思想
將調(diào)度行為抽象形成“調(diào)度中心”公共平臺,而平臺自身并不承擔業(yè)務邏輯,“調(diào)度中心”負責發(fā)起調(diào)度請求。
將任務抽象成分散的JobHandler,交由“執(zhí)行器”統(tǒng)一管理,“執(zhí)行器”負責接收調(diào)度請求并執(zhí)行對應的JobHandler中業(yè)務邏輯。
因此,“調(diào)度”和“任務”兩部分可以相互解耦,提高系統(tǒng)整體穩(wěn)定性和擴展性;
2、系統(tǒng)組成
- 調(diào)度模塊(調(diào)度中心):
負責管理調(diào)度信息,按照調(diào)度配置發(fā)出調(diào)度請求,自身不承擔業(yè)務代碼。調(diào)度系統(tǒng)與任務解耦,提高了系統(tǒng)可用性和穩(wěn)定性,同時調(diào)度系統(tǒng)性能不再受限于任務模塊;
支持可視化、簡單且動態(tài)的管理調(diào)度信息,包括任務新建,更新,刪除,GLUE開發(fā)和任務報警等,所有上述操作都會實時生效,同時支持監(jiān)控調(diào)度結(jié)果以及執(zhí)行日志,支持執(zhí)行器Failover。- 執(zhí)行模塊(執(zhí)行器):
負責接收調(diào)度請求并執(zhí)行任務邏輯。任務模塊專注于任務的執(zhí)行等操作,開發(fā)和維護更加簡單和高效;
接收“調(diào)度中心”的執(zhí)行請求、終止請求和日志請求等。
3、架構(gòu)圖
4、調(diào)度模塊剖析
1、quartz的不足
Quartz作為開源作業(yè)調(diào)度中的佼佼者,是作業(yè)調(diào)度的首選。但是集群環(huán)境中Quartz采用API的方式對任務進行管理,從而可以避免上述問題,但是同樣存在以下問題:
- 問題一:調(diào)用API的的方式操作任務,不人性化;
- 問題二:需要持久化業(yè)務QuartzJobBean到底層數(shù)據(jù)表中,系統(tǒng)侵入性相當嚴重。
- 問題三:調(diào)度邏輯和QuartzJobBean耦合在同一個項目中,這將導致一個問題,在調(diào)度任務數(shù)量逐漸增多,同時調(diào)度任務邏輯逐漸加重的情況下,此時調(diào)度系統(tǒng)的性能將大大受限于業(yè)務;
- 問題四:quartz底層以“搶占式”獲取DB鎖并由搶占成功節(jié)點負責運行任務,會導致節(jié)點負載懸殊非常大;而XXL-JOB通過執(zhí)行器實現(xiàn)“協(xié)同分配式”運行任務,充分發(fā)揮集群優(yōu)勢,負載各節(jié)點均衡。
XXL-JOB彌補了quartz的上述不足之處
二、快速入門
2.1 初始化“調(diào)度數(shù)據(jù)庫”
請下載項目源碼并解壓,獲取 “調(diào)度數(shù)據(jù)庫初始化SQL腳本” 并執(zhí)行即可。
“調(diào)度數(shù)據(jù)庫初始化SQL腳本” 位置為:
/xxl-job/doc/db/tables_xxl_job.sql
調(diào)度中心支持集群部署,集群情況下各節(jié)點務必連接同一個mysql實例;
如果mysql做主從,調(diào)度中心集群節(jié)點務必強制走主庫;
2.2 編譯源碼
解壓源碼,按照maven格式將源碼導入IDE, 使用maven進行編譯即可,源碼結(jié)構(gòu)如下:
xxl-job-admin:調(diào)度中心
xxl-job-core:公共依賴
xxl-job-executor-samples:執(zhí)行器Sample示例(選擇合適的版本執(zhí)行器,可直接使用,也可以參考其并將現(xiàn)有項目改造成執(zhí)行器)
:xxl-job-executor-sample-springboot:Springboot版本,通過Springboot管理執(zhí)行器,推薦這種方式;
:xxl-job-executor-sample-frameless:無框架版本;
2.3 配置部署“調(diào)度中心”
調(diào)度中心項目:xxl-job-admin
作用:統(tǒng)一管理任務調(diào)度平臺上調(diào)度任務,負責觸發(fā)調(diào)度執(zhí)行,并且提供任務管理平臺。
步驟一:調(diào)度中心配置:
調(diào)度中心配置文件地址:
/xxl-job/xxl-job-admin/src/main/resources/application.properties
調(diào)度中心配置內(nèi)容說明:
### 調(diào)度中心JDBC鏈接:鏈接地址請保持和 2.1章節(jié) 所創(chuàng)建的調(diào)度數(shù)據(jù)庫的地址一致
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
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
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### 調(diào)度中心通訊TOKEN [選填]:非空時啟用;
xxl.job.accessToken=
### 調(diào)度中心國際化配置 [必填]: 默認為 "zh_CN"/中文簡體, 可選范圍為 "zh_CN"/中文簡體, "zh_TC"/中文繁體 and "en"/英文;
xxl.job.i18n=zh_CN
## 調(diào)度線程池最大線程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### 調(diào)度中心日志表數(shù)據(jù)保存天數(shù) [必填]:過期日志自動清理;限制大于等于7時生效,否則, 如-1,關閉自動清理功能;
xxl.job.logretentiondays=30
步驟二:部署項目:
如果已經(jīng)正確進行上述配置,可將項目編譯打包部署。
調(diào)度中心訪問地址:http://localhost:8080/xxl-job-admin?(該地址執(zhí)行器將會使用到,作為回調(diào)地址)
默認登錄賬號 “admin/123456”, 登錄后運行界面如下圖所示。
至此“調(diào)度中心”項目已經(jīng)部署成功。
步驟三:調(diào)度中心集群(可選):
調(diào)度中心支持集群部署,提升調(diào)度系統(tǒng)容災和可用性。
調(diào)度中心集群部署時,幾點要求和建議:
- DB配置保持一致;
- 集群機器時鐘保持一致(單機集群忽視);
- 建議:推薦通過nginx為調(diào)度中心集群做負載均衡,分配域名。調(diào)度中心訪問、執(zhí)行器回調(diào)配置、調(diào)用API服務等操作均通過該域名進行。
其他:Docker 鏡像方式搭建調(diào)度中心:
- 下載鏡像
// Docker地址:https://hub.docker.com/r/xuxueli/xxl-job-admin/ (建議指定版本號)
docker pull xuxueli/xxl-job-admin
- 創(chuàng)建容器并運行
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:{指定版本}
/**
* 如需自定義 mysql 等配置,可通過 "-e PARAMS" 指定,參數(shù)格式 PARAMS="--key=value --key2=value2" ;
* 配置項參考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties
* 如需自定義 JVM內(nèi)存參數(shù) 等配置,可通過 "-e JAVA_OPTS" 指定,參數(shù)格式 JAVA_OPTS="-Xmx512m" ;
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:{指定版本}
2.4 配置部署“執(zhí)行器項目”
“執(zhí)行器”項目:xxl-job-executor-sample-springboot (提供多種版本執(zhí)行器供選擇,現(xiàn)以 springboot 版本為例,可直接使用,也可以參考其并將現(xiàn)有項目改造成執(zhí)行器)
作用:負責接收“調(diào)度中心”的調(diào)度并執(zhí)行;可直接部署執(zhí)行器,也可以將執(zhí)行器集成到現(xiàn)有業(yè)務項目中。
步驟一:maven依賴
確認pom文件中引入了 “xxl-job-core” 的maven依賴;
步驟二:執(zhí)行器配置
執(zhí)行器配置,配置文件地址:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
執(zhí)行器配置,配置內(nèi)容說明:
### 調(diào)度中心部署根地址 [選填]:如調(diào)度中心集群部署存在多個地址則用逗號分隔。執(zhí)行器將會使用該地址進行"執(zhí)行器心跳注冊"和"任務結(jié)果回調(diào)";為空則關閉自動注冊;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 執(zhí)行器通訊TOKEN [選填]:非空時啟用;
xxl.job.accessToken=
### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊分組依據(jù);為空則關閉自動注冊
xxl.job.executor.appname=xxl-job-executor-sample
### 執(zhí)行器注冊 [選填]:優(yōu)先使用該配置作為注冊地址,為空時使用內(nèi)嵌服務 ”IP:PORT“ 作為注冊地址。從而更靈活的支持容器類型執(zhí)行器動態(tài)IP和動態(tài)映射端口問題。
xxl.job.executor.address=
### 執(zhí)行器IP [選填]:默認為空表示自動獲取IP,多網(wǎng)卡時可手動設置指定IP,該IP不會綁定Host僅作為通訊實用;地址信息用于 "執(zhí)行器注冊" 和 "調(diào)度中心請求并觸發(fā)任務";
xxl.job.executor.ip=
### 執(zhí)行器端口號 [選填]:小于等于0則自動獲?。荒J端口為9999,單機部署多個執(zhí)行器時,注意要配置不同執(zhí)行器端口;
xxl.job.executor.port=9999
### 執(zhí)行器運行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權(quán)限;為空則使用默認路徑;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 執(zhí)行器日志文件保存天數(shù) [選填] : 過期日志自動清理, 限制值大于等于3時生效; 否則, 如-1, 關閉自動清理功能;
xxl.job.executor.logretentiondays=30
步驟三:執(zhí)行器組件配置
執(zhí)行器組件,配置文件地址:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java
執(zhí)行器組件,配置內(nèi)容說明:
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
步驟四:部署執(zhí)行器項目:
如果已經(jīng)正確進行上述配置,可將執(zhí)行器項目編譯打部署,系統(tǒng)提供多種執(zhí)行器Sample示例項目,選擇其中一個即可,各自的部署方式如下。
xxl-job-executor-sample-springboot:項目編譯打包成springboot類型的可執(zhí)行JAR包,命令啟動即可;
xxl-job-executor-sample-frameless:項目編譯打包成JAR包,命令啟動即可;
至此“執(zhí)行器”項目已經(jīng)部署結(jié)束。
步驟五:執(zhí)行器集群(可選):
執(zhí)行器支持集群部署,提升調(diào)度系統(tǒng)可用性,同時提升任務處理能力。
執(zhí)行器集群部署時,幾點要求和建議:
- 執(zhí)行器回調(diào)地址(xxl.job.admin.addresses)需要保持一致;執(zhí)行器根據(jù)該配置進行執(zhí)行器自動注冊等操作。
- 同一個執(zhí)行器集群內(nèi)AppName(xxl.job.executor.appname)需要保持一致;調(diào)度中心根據(jù)該配置動態(tài)發(fā)現(xiàn)不同集群的在線執(zhí)行器列表。
2.5 開發(fā)第一個任務“Hello World”
本示例以新建一個 “GLUE模式(Java)” 運行模式的任務為例。更多有關任務的詳細配置,請查看“章節(jié)三:任務詳解”。
( “GLUE模式(Java)”的執(zhí)行代碼托管到調(diào)度中心在線維護,相比“Bean模式任務”需要在執(zhí)行器項目開發(fā)部署上線,更加簡便輕量)
前提:請確認“調(diào)度中心”和“執(zhí)行器”項目已經(jīng)成功部署并啟動;
步驟一:新建任務:
登錄調(diào)度中心,點擊下圖所示“新建任務”按鈕,新建示例任務。然后,參考下面截圖中任務的參數(shù)配置,點擊保存。
步驟二:“GLUE模式(Java)” 任務開發(fā):
請點擊任務右側(cè) “GLUE” 按鈕,進入 “GLUE編輯器開發(fā)界面” ,見下圖?!癎LUE模式(Java)” 運行模式的任務默認已經(jīng)初始化了示例任務代碼,即打印Hello World。
( “GLUE模式(Java)” 運行模式的任務實際上是一段繼承自IJobHandler的Java類代碼,它在執(zhí)行器項目中運行,可使用@Resource/@Autowire注入執(zhí)行器里中的其他服務,詳細介紹請查看第三章節(jié))
步驟三:觸發(fā)執(zhí)行:
請點擊任務右側(cè) “執(zhí)行” 按鈕,可手動觸發(fā)一次任務執(zhí)行(通常情況下,通過配置Cron表達式進行任務調(diào)度觸發(fā))。
步驟四:查看日志:
請點擊任務右側(cè) “日志” 按鈕,可前往任務日志界面查看任務日志。
在任務日志界面中,可查看該任務的歷史調(diào)度記錄以及每一次調(diào)度的任務調(diào)度信息、執(zhí)行參數(shù)和執(zhí)行信息。運行中的任務點擊右側(cè)的“執(zhí)行日志”按鈕,可進入日志控制臺查看實時執(zhí)行日志。
在日志控制臺,可以Rolling方式實時查看任務在執(zhí)行器一側(cè)運行輸出的日志信息,實時監(jiān)控任務進度;
三、任務詳解
配置屬性詳細說明:
基礎配置:
- 執(zhí)行器:任務的綁定的執(zhí)行器,任務觸發(fā)調(diào)度時將會自動發(fā)現(xiàn)注冊成功的執(zhí)行器, 實現(xiàn)任務自動發(fā)現(xiàn)功能; 另一方面也可以方便的進行任務分組。每個任務必須綁定一個執(zhí)行器, 可在 "執(zhí)行器管理" 進行設置;
- 任務描述:任務的描述信息,便于任務管理;
- 負責人:任務的負責人;
- 報警郵件:任務調(diào)度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;
觸發(fā)配置:
- 調(diào)度類型:
無:該類型不會主動觸發(fā)調(diào)度;
CRON:該類型將會通過CRON,觸發(fā)任務調(diào)度;
固定速度:該類型將會以固定速度,觸發(fā)任務調(diào)度;按照固定的間隔時間,周期性觸發(fā);
固定延遲:該類型將會以固定延遲,觸發(fā)任務調(diào)度;按照固定的延遲時間,從上次調(diào)度結(jié)束后開始計算延遲時間,到達延遲時間后觸發(fā)下次調(diào)度;
- CRON:觸發(fā)任務執(zhí)行的Cron表達式;
- 固定速度:固定速度的時間間隔,單位為秒;
- 固定延遲:固定延遲的時間間隔,單位為秒;
任務配置:
- 運行模式:
BEAN模式:任務以JobHandler方式維護在執(zhí)行器端;需要結(jié)合 "JobHandler" 屬性匹配執(zhí)行器中任務;
GLUE模式(Java):任務以源碼方式維護在調(diào)度中心;該模式的任務實際上是一段繼承自IJobHandler的Java類代碼并 "groovy" 源碼方式維護,它在執(zhí)行器項目中運行,可使用@Resource/@Autowire注入執(zhí)行器里中的其他服務;
GLUE模式(Shell):任務以源碼方式維護在調(diào)度中心;該模式的任務實際上是一段 "shell" 腳本;
GLUE模式(Python):任務以源碼方式維護在調(diào)度中心;該模式的任務實際上是一段 "python" 腳本;
GLUE模式(PHP):任務以源碼方式維護在調(diào)度中心;該模式的任務實際上是一段 "php" 腳本;
GLUE模式(NodeJS):任務以源碼方式維護在調(diào)度中心;該模式的任務實際上是一段 "nodejs" 腳本;
GLUE模式(PowerShell):任務以源碼方式維護在調(diào)度中心;該模式的任務實際上是一段 "PowerShell" 腳本;
- JobHandler:運行模式為 "BEAN模式" 時生效,對應執(zhí)行器中新開發(fā)的JobHandler類“@JobHandler”注解自定義的value值;
- 執(zhí)行參數(shù):任務執(zhí)行所需的參數(shù);
高級配置:
- 路由策略:當執(zhí)行器集群部署時,提供豐富的路由策略,包括;
FIRST(第一個):固定選擇第一個機器;
LAST(最后一個):固定選擇最后一個機器;
ROUND(輪詢):;
RANDOM(隨機):隨機選擇在線的機器;
CONSISTENT_HASH(一致性HASH):每個任務按照Hash算法固定選擇某一臺機器,且所有任務均勻散列在不同機器上。
LEAST_FREQUENTLY_USED(最不經(jīng)常使用):使用頻率最低的機器優(yōu)先被選舉;
LEAST_RECENTLY_USED(最近最久未使用):最久未使用的機器優(yōu)先被選舉;
FAILOVER(故障轉(zhuǎn)移):按照順序依次進行心跳檢測,第一個心跳檢測成功的機器選定為目標執(zhí)行器并發(fā)起調(diào)度;
BUSYOVER(忙碌轉(zhuǎn)移):按照順序依次進行空閑檢測,第一個空閑檢測成功的機器選定為目標執(zhí)行器并發(fā)起調(diào)度;
SHARDING_BROADCAST(分片廣播):廣播觸發(fā)對應集群中所有機器執(zhí)行一次任務,同時系統(tǒng)自動傳遞分片參數(shù);可根據(jù)分片參數(shù)開發(fā)分片任務;
- 子任務:每個任務都擁有一個唯一的任務ID(任務ID可以從任務列表獲取),當本任務執(zhí)行結(jié)束并且執(zhí)行成功時,將會觸發(fā)子任務ID所對應的任務的一次主動調(diào)度。
- 調(diào)度過期策略:
- 忽略:調(diào)度過期后,忽略過期的任務,從當前時間開始重新計算下次觸發(fā)時間;
- 立即執(zhí)行一次:調(diào)度過期后,立即執(zhí)行一次,并從當前時間開始重新計算下次觸發(fā)時間;
- 阻塞處理策略:調(diào)度過于密集執(zhí)行器來不及處理時的處理策略;
單機串行(默認):調(diào)度請求進入單機執(zhí)行器后,調(diào)度請求進入FIFO隊列并以串行方式運行;
丟棄后續(xù)調(diào)度:調(diào)度請求進入單機執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運行的調(diào)度任務,本次請求將會被丟棄并標記為失??;
覆蓋之前調(diào)度:調(diào)度請求進入單機執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運行的調(diào)度任務,將會終止運行中的調(diào)度任務并清空隊列,然后運行本地調(diào)度任務;
- 任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
- 失敗重試次數(shù);支持自定義任務失敗重試次數(shù),當任務失敗時將會按照預設的失敗重試次數(shù)主動進行重試;
3.1 BEAN模式(類形式)
Bean模式任務,支持基于類的開發(fā)方式,每個任務對應一個Java類。
- 優(yōu)點:不限制項目環(huán)境,兼容性好。即使是無框架項目,如main方法直接啟動的項目也可以提供支持,可以參考示例項目 “xxl-job-executor-sample-frameless”;
- 缺點:
- 每個任務需要占用一個Java類,造成類的浪費;
- 不支持自動掃描任務并注入到執(zhí)行器容器,需要手動注入。
步驟一:執(zhí)行器項目中,開發(fā)Job類:
1、開發(fā)一個繼承自"com.xxl.job.core.handler.IJobHandler"的JobHandler類,實現(xiàn)其中任務方法。
2、手動通過如下方式注入到執(zhí)行器容器。
```
XxlJobExecutor.registJobHandler("demoJobHandler", new DemoJobHandler());
```
步驟二:調(diào)度中心,新建調(diào)度任務
后續(xù)步驟和 “3.2 BEAN模式(方法形式)”一致,可以前往參考。
3.2 BEAN模式(方法形式)
Bean模式任務,支持基于方法的開發(fā)方式,每個任務對應一個方法。
- 優(yōu)點:
- 每個任務只需要開發(fā)一個方法,并添加”@XxlJob”注解即可,更加方便、快速。
- 支持自動掃描任務并注入到執(zhí)行器容器。
- 缺點:要求Spring容器環(huán)境;
基于方法開發(fā)的任務,底層會生成JobHandler代理,和基于類的方式一樣,任務也會以JobHandler的形式存在于執(zhí)行器任務容器中。
步驟一:執(zhí)行器項目中,開發(fā)Job方法:
1、任務開發(fā):在Spring Bean實例中,開發(fā)Job方法;
2、注解配置:為Job方法添加注解 "@XxlJob(value="自定義jobhandler名稱", init = "JobHandler初始化方法", destroy = "JobHandler銷毀方法")",注解value值對應的是調(diào)度中心新建任務的JobHandler屬性的值。
3、執(zhí)行日志:需要通過 "XxlJobHelper.log" 打印執(zhí)行日志;
4、任務結(jié)果:默認任務結(jié)果為 "成功" 狀態(tài),不需要主動設置;如有訴求,比如設置任務結(jié)果為失敗,可以通過 "XxlJobHelper.handleFail/handleSuccess" 自主設置任務結(jié)果;
// 可參考Sample示例執(zhí)行器中的 "com.xxl.job.executor.service.jobhandler.SampleXxlJob" ,如下:
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
}
步驟二:調(diào)度中心,新建調(diào)度任務
參考上文“配置屬性詳細說明”對新建的任務進行參數(shù)配置,運行模式選中 “BEAN模式”,JobHandler屬性填寫任務注解“@XxlJob”中定義的值;
原生內(nèi)置Bean模式任務
為方便用戶參考與快速實用,示例執(zhí)行器內(nèi)原生提供多個Bean模式任務Handler,可以直接配置實用,如下:
- demoJobHandler:簡單示例任務,任務內(nèi)部模擬耗時任務邏輯,用戶可在線體驗Rolling Log等功能;
- shardingJobHandler:分片示例任務,任務內(nèi)部模擬處理分片參數(shù),可參考熟悉分片任務;
- httpJobHandler:通用HTTP任務Handler;業(yè)務方只需要提供HTTP鏈接等信息即可,不限制語言、平臺。示例任務入?yún)⑷缦拢?
url: http://www.xxx.com
method: get 或 post
data: post-data
- commandJobHandler:通用命令行任務Handler;業(yè)務方只需要提供命令行即可;如 “pwd”命令;
3.3 GLUE模式(Java)
任務以源碼方式維護在調(diào)度中心,支持通過Web IDE在線更新,實時編譯和生效,因此不需要指定JobHandler。開發(fā)流程如下:
步驟一:調(diào)度中心,新建調(diào)度任務:
參考上文“配置屬性詳細說明”對新建的任務進行參數(shù)配置,運行模式選中 “GLUE模式(Java)”;
步驟二:開發(fā)任務代碼:
選中指定任務,點擊該任務右側(cè)“GLUE”按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(fā)(也可以在IDE中開發(fā)完成后,復制粘貼到編輯中)。
版本回溯功能(支持30個版本的版本回溯):在GLUE任務的Web IDE界面,選擇右上角下拉框“版本回溯”,會列出該GLUE的更新歷史,選擇相應版本即可顯示該版本代碼,保存后GLUE代碼即回退到對應的歷史版本;
3.4 GLUE模式(Shell)
步驟一:調(diào)度中心,新建調(diào)度任務
參考上文“配置屬性詳細說明”對新建的任務進行參數(shù)配置,運行模式選中 “GLUE模式(Shell)”;
步驟二:開發(fā)任務代碼:
選中指定任務,點擊該任務右側(cè)“GLUE”按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(fā)(也可以在IDE中開發(fā)完成后,復制粘貼到編輯中)。
該模式的任務實際上是一段 “shell” 腳本;
3.4 GLUE模式(Python)
步驟一:調(diào)度中心,新建調(diào)度任務
參考上文“配置屬性詳細說明”對新建的任務進行參數(shù)配置,運行模式選中 “GLUE模式(Python)”;
步驟二:開發(fā)任務代碼:
選中指定任務,點擊該任務右側(cè)“GLUE”按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(fā)(也可以在IDE中開發(fā)完成后,復制粘貼到編輯中)。
該模式的任務實際上是一段 “python” 腳本;
3.5 GLUE模式(NodeJS)
步驟一:調(diào)度中心,新建調(diào)度任務
參考上文“配置屬性詳細說明”對新建的任務進行參數(shù)配置,運行模式選中 “GLUE模式(NodeJS)”;
步驟二:開發(fā)任務代碼:
選中指定任務,點擊該任務右側(cè)“GLUE”按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(fā)(也可以在IDE中開發(fā)完成后,復制粘貼到編輯中)。
該模式的任務實際上是一段 “nodeJS” 腳本;
3.6 GLUE模式(PHP)
同上
3.7 GLUE模式(PowerShell)
同上
四、操作指南
4.1 配置執(zhí)行器
點擊進入”執(zhí)行器管理”界面, 如下圖:
1、"調(diào)度中心OnLine:"右側(cè)顯示在線的"調(diào)度中心"列表, 任務執(zhí)行結(jié)束后, 將會以failover的模式進行回調(diào)調(diào)度中心通知執(zhí)行結(jié)果, 避免回調(diào)的單點風險;
2、"執(zhí)行器列表" 中顯示在線的執(zhí)行器列表, 可通過"OnLine 機器"查看對應執(zhí)行器的集群機器。
點擊按鈕 “+新增執(zhí)行器” 彈框如下圖, 可新增執(zhí)行器配置:
執(zhí)行器屬性說明
AppName: 是每個執(zhí)行器集群的唯一標示AppName, 執(zhí)行器會周期性以AppName為對象進行自動注冊??赏ㄟ^該配置自動發(fā)現(xiàn)注冊成功的執(zhí)行器, 供任務調(diào)度時使用;
名稱: 執(zhí)行器的名稱, 因為AppName限制字母數(shù)字等組成,可讀性不強, 名稱為了提高執(zhí)行器的可讀性;
排序: 執(zhí)行器的排序, 系統(tǒng)中需要執(zhí)行器的地方,如任務新增, 將會按照該排序讀取可用的執(zhí)行器列表;
注冊方式:調(diào)度中心獲取執(zhí)行器地址的方式;
自動注冊:執(zhí)行器自動進行執(zhí)行器注冊,調(diào)度中心通過底層注冊表可以動態(tài)發(fā)現(xiàn)執(zhí)行器機器地址;
手動錄入:人工手動錄入執(zhí)行器的地址信息,多地址逗號分隔,供調(diào)度中心使用;
機器地址:"注冊方式"為"手動錄入"時有效,支持人工維護執(zhí)行器的地址信息;
4.2 新建任務
進入任務管理界面,點擊“新增任務”按鈕,在彈出的“新增任務”界面配置任務屬性后保存即可。詳情頁參考章節(jié) “三、任務詳解”。
4.3 編輯任務
進入任務管理界面,選中指定任務。點擊該任務右側(cè)“編輯”按鈕,在彈出的“編輯任務”界面更新任務屬性后保存即可,可以修改設置的任務屬性信息:
4.4 編輯GLUE代碼
該操作僅針對GLUE任務。
選中指定任務,點擊該任務右側(cè)“GLUE”按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(fā)??蓞⒖颊鹿?jié) “3.3 GLUE模式(Java)”。
4.5 啟動/停止任務
可對任務進行“啟動”和“停止”操作。
需要注意的是,此處的啟動/停止僅針對任務的后續(xù)調(diào)度觸發(fā)行為,不會影響到已經(jīng)觸發(fā)的調(diào)度任務,如需終止已經(jīng)觸發(fā)的調(diào)度任務,可查看“4.9 終止運行中的任務”
4.6 手動觸發(fā)一次調(diào)度
點擊“執(zhí)行”按鈕,可手動觸發(fā)一次任務調(diào)度,不影響原有調(diào)度規(guī)則。
4.7 查看調(diào)度日志
點擊“日志”按鈕,可以查看任務歷史調(diào)度日志。在歷史調(diào)入日志界面可查看每次任務調(diào)度的調(diào)度結(jié)果、執(zhí)行結(jié)果等,點擊“執(zhí)行日志”按鈕可查看執(zhí)行器完整日志。
調(diào)度時間:"調(diào)度中心"觸發(fā)本次調(diào)度并向"執(zhí)行器"發(fā)送任務執(zhí)行信號的時間;
調(diào)度結(jié)果:"調(diào)度中心"觸發(fā)本次調(diào)度的結(jié)果,200表示成功,500或其他表示失敗;
調(diào)度備注:"調(diào)度中心"觸發(fā)本次調(diào)度的日志信息;
執(zhí)行器地址:本次任務執(zhí)行的機器地址
運行模式:觸發(fā)調(diào)度時任務的運行模式,運行模式可參考章節(jié) "三、任務詳解";
任務參數(shù):本地任務執(zhí)行的入?yún)?/code>
執(zhí)行時間:"執(zhí)行器"中本次任務執(zhí)行結(jié)束后回調(diào)的時間;
執(zhí)行結(jié)果:"執(zhí)行器"中本次任務執(zhí)行的結(jié)果,200表示成功,500或其他表示失??;
執(zhí)行備注:"執(zhí)行器"中本次任務執(zhí)行的日志信息;
操作:
"執(zhí)行日志"按鈕:點擊可查看本地任務執(zhí)行的詳細日志信息;詳見“4.8 查看執(zhí)行日志”;
"終止任務"按鈕:點擊可終止本地調(diào)度對應執(zhí)行器上本任務的執(zhí)行線程,包括未執(zhí)行的阻塞任務一并被終止;
4.8 查看執(zhí)行日志
點擊執(zhí)行日志右側(cè)的 “執(zhí)行日志” 按鈕,可跳轉(zhuǎn)至執(zhí)行日志界面,可以查看業(yè)務代碼中打印的完整日志,如下圖;
4.9 終止運行中的任務
僅針對執(zhí)行中的任務。
在任務日志界面,點擊右側(cè)的“終止任務”按鈕,將會向本次任務對應的執(zhí)行器發(fā)送任務終止請求,將會終止掉本次任務,同時會清空掉整個任務執(zhí)行隊列。
任務終止時通過 “interrupt” 執(zhí)行線程的方式實現(xiàn), 將會觸發(fā) “InterruptedException” 異常。因此如果JobHandler內(nèi)部catch到了該異常并消化掉的話, 任務終止功能將不可用。
因此, 如果遇到上述任務終止不可用的情況, 需要在JobHandler中應該針對 “InterruptedException” 異常進行特殊處理 (向上拋出) , 正確邏輯如下:
try{
// do something
} catch (Exception e) {
if (e instanceof InterruptedException) {
throw e;
}
logger.warn("{}", e);
}
而且,在JobHandler中開啟子線程時,子線程也不可catch處理”InterruptedException”,應該主動向上拋出。
任務終止時會執(zhí)行對應JobHandler的”destroy()”方法,可以借助該方法處理一些資源回收的邏輯。
4.10 刪除執(zhí)行日志
在任務日志界面,選中執(zhí)行器和任務之后,點擊右側(cè)的”刪除”按鈕將會出現(xiàn)”日志清理”彈框,彈框中支持選擇不同類型的日志清理策略,選中后點擊”確定”按鈕即可進行日志清理操作;
4.11 刪除任務
點擊刪除按鈕,可以刪除對應任務。
4.12 用戶管理
進入 “用戶管理” 界面,可查看和管理用戶信息;
目前用戶分為兩種角色:
- 管理員:擁有全量權(quán)限,支持在線管理用戶信息,為用戶分配權(quán)限,權(quán)限分配粒度為執(zhí)行器;
- 普通用戶:僅擁有被分配權(quán)限的執(zhí)行器,及相關任務的操作權(quán)限;
文章來源:http://www.zghlxwxcb.cn/news/detail-515713.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-515713.html
到了這里,關于Java -- XXL-JOB分布式任務調(diào)度平臺的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!