源碼下載地址 https://github.com/xuxueli/xxl-job/releases
一蛋褥、需求背景
以往系統(tǒng)中的周期性任務(wù)執(zhí)行,一般有以下幾種方式
- 引入quartz or spring-task 睛驳,每一個(gè)任務(wù)對應(yīng)編寫一個(gè)執(zhí)行類烙心,配置調(diào)度規(guī)則執(zhí)行
- 使用系統(tǒng)的執(zhí)行器,比如centos的crontab乏沸,每一個(gè)任務(wù)對應(yīng)編寫一個(gè)執(zhí)行類淫茵,并在crontab 配置調(diào)度規(guī)則
此時(shí),又會出現(xiàn)以下的問題
- 任務(wù)出現(xiàn)異常蹬跃,需增加報(bào)警功能
- 任務(wù)出現(xiàn)阻塞匙瘪,比如上一次任務(wù)沒執(zhí)行完,下次任務(wù)會排隊(duì)等待蝶缀,以此累積
- 任務(wù)超時(shí)丹喻,需自己主動(dòng)中斷任務(wù)
- 單機(jī)任務(wù)調(diào)度下,系統(tǒng)出現(xiàn)異常翁都,比如內(nèi)存爆掉碍论,磁盤空間不夠用
- 任務(wù)失敗,需hardcode 指定次數(shù)重試
- 在沒有配日志可視化的前提下荐吵,查看日志需要去服務(wù)器上敲命令骑冗,面臨rm -rf *的風(fēng)險(xiǎn)
- ...
二、什么是xxl-job
XXL-JOB是一個(gè)輕量級分布式任務(wù)調(diào)度平臺先煎,支持通過 Web 頁面對任務(wù)進(jìn)行 CRUD 操作贼涩,支持動(dòng)態(tài)修改任務(wù)狀態(tài)、暫停/恢復(fù)任務(wù)薯蝎,以及終止運(yùn)行中任務(wù)遥倦,支持在線配置調(diào)度任務(wù)入?yún)⒑驮诰€查看調(diào)度結(jié)果。
它的特點(diǎn)有:
平臺:
調(diào)度中心式設(shè)計(jì)
- 解耦
- 用DB實(shí)現(xiàn)注冊中心,實(shí)現(xiàn)輕量級部署
- 彈性擴(kuò)袒哥、縮容
- 故障轉(zhuǎn)移:執(zhí)行器集群某臺機(jī)器出現(xiàn)故障缩筛,能夠自動(dòng)切換正常的執(zhí)行器
- 分片廣播:且支持動(dòng)態(tài)分片,提升任務(wù)運(yùn)行效率
- 路由策略:執(zhí)行器集群部署時(shí)提供豐富的路由策略堡称,包括:第一個(gè)瞎抛、最后一個(gè)、輪詢却紧、隨機(jī)桐臊、一致性HASH、最不經(jīng)常使用晓殊、最近最久未使用断凶、故障轉(zhuǎn)移、忙碌轉(zhuǎn)移等巫俺;
-
全異步化
:異步調(diào)度和異步執(zhí)行认烁。
任務(wù):
任務(wù)分布式執(zhí)行
- 簡單:支持通過web對任務(wù)進(jìn)行crud
- 靈活:動(dòng)態(tài)修改任務(wù)狀態(tài),自定義失敗重試次數(shù)等介汹,且即時(shí)生效
- 告警:任務(wù)失敗却嗡,支持郵件告警
三、概念說明
任務(wù)
調(diào)度任務(wù)痴昧,系統(tǒng)角色中的最小單元
- 可通過webide(GLUE模式) 或者ide(BEAN模式)自定義任務(wù)內(nèi)容
- 支持多種路由策略和阻塞處理策略的選擇
- 支持自定義失敗重試次數(shù)和任務(wù)超時(shí)時(shí)間
- 支持任務(wù)失敗告警
- 支持動(dòng)態(tài)修改任務(wù)狀態(tài)和各個(gè)配置策略的修改
調(diào)度中心
統(tǒng)一管理任務(wù)調(diào)度平臺上的調(diào)度任務(wù)稽穆,負(fù)責(zé)觸發(fā)調(diào)度執(zhí)行,并提供可視化平臺管理
執(zhí)行器
主要負(fù)責(zé)接收“調(diào)度中心”的調(diào)度并執(zhí)行
四赶撰、安裝啟動(dòng)
下載
https://github.com/xuxueli/xxl-job
環(huán)境要求
- Maven3+
- JDK1.7+
- MYSQL5.6+
入門
-
初始化數(shù)據(jù)庫
sql腳本在源碼內(nèi)舌镶,用navicat工具導(dǎo)入即可
doc/db/tables_xxl_job.sql
-
調(diào)度數(shù)據(jù)庫配置說明
- xxl_job_lock:任務(wù)調(diào)度鎖表;
- xxl_job_group:執(zhí)行器信息表豪娜,維護(hù)任務(wù)執(zhí)行器信息餐胀;
- xxl_job_info:調(diào)度擴(kuò)展信息表: 用于保存XXL-JOB調(diào)度任務(wù)的擴(kuò)展信息,如任務(wù)分組瘤载、任務(wù)名否灾、機(jī)器地址、執(zhí)行器鸣奔、執(zhí)行入?yún)⒑蛨?bào)警郵件等等墨技;
- xxl_job_log:調(diào)度日志表: 用于保存XXL-JOB任務(wù)調(diào)度的歷史信息,如調(diào)度結(jié)果挎狸、執(zhí)行結(jié)果扣汪、調(diào)度入?yún)ⅰ⒄{(diào)度機(jī)器和執(zhí)行器等等锨匆;
- xxl_job_logglue:任務(wù)GLUE日志:用于保存GLUE更新歷史崭别,用于支持GLUE的版本回溯功能;
- xxl_job_registry:執(zhí)行器注冊表,維護(hù)在線的執(zhí)行器和調(diào)度中心機(jī)器地址信息茅主;
- xxl_job_user:系統(tǒng)用戶表舞痰;
-
項(xiàng)目結(jié)構(gòu)
xxl-job-admin:調(diào)度中心
xxl-job-core:公共依賴
xxl-job-executor-samples:執(zhí)行器Sample示例(選擇合適的版本執(zhí)行器,可直接使用诀姚,也可以參考其并將現(xiàn)有項(xiàng)目改造成執(zhí)行器)
:xxl-job-executor-sample-springboot:Springboot版本响牛,通過Springboot管理執(zhí)行器,推薦這種方式赫段;
:xxl-job-executor-sample-spring:Spring版本娃善,通過Spring容器管理執(zhí)行器,比較通用瑞佩;
:xxl-job-executor-sample-frameless:無框架版本;
:xxl-job-executor-sample-jfinal:JFinal版本坯台,通過JFinal管理執(zhí)行器炬丸;
:xxl-job-executor-sample-nutz:Nutz版本,通過Nutz管理執(zhí)行器蜒蕾;
-
配置部署“調(diào)度中心”(xxl-job-admin)
更改配置
### web server.port=8080 server.context-path=/xxl-job-admin ### resources spring.mvc.static-path-pattern=/static/** spring.resources.static-locations=classpath:/static/ ### freemarker spring.freemarker.templateLoaderPath=classpath:/templates/ spring.freemarker.suffix=.ftl spring.freemarker.charset=UTF-8 spring.freemarker.request-context-attribute=request spring.freemarker.settings.number_format=0.########## ### mybatis mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml ### xxl-job, datasource spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource spring.datasource.tomcat.max-wait=10000 spring.datasource.tomcat.max-active=30 spring.datasource.tomcat.test-on-borrow=true spring.datasource.tomcat.validation-query=SELECT 1 spring.datasource.tomcat.validation-interval=30000 ### xxl-job email 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 ### xxl-job, access token xxl.job.accessToken= ### xxl-job, i18n (default empty as chinese, "en" as english) xxl.job.i18n=
部署項(xiàng)目
方式一:項(xiàng)目打包部署
打包xxl-job-admin
-
調(diào)度中心訪問地址:http://localhost:8080/xxl-job-admin (該地址執(zhí)行器將會使用到稠炬,作為回調(diào)地址)
默認(rèn)登錄賬號:admin 默認(rèn)登錄密碼:123456
center.jpg方式二:Docker鏡像搭建
- 下載鏡像
docker pull xuxueli/xxl-job-admin
-
創(chuàng)建容器
由于官方鏡像的配置文件(application.properties)是默認(rèn)的,這里需要通過 "PARAMS" 指定咪啡,參數(shù)格式 RAMS="--key=value --key2=value2" 去修改首启;
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job? Unicode=true&characterEncoding=UTF-8" -p 8082:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin
-
運(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
調(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)行楔绞。
-
配置部署“執(zhí)行器項(xiàng)目”(xxl-job-executor-sample)
執(zhí)行器配置application.properties
# web port server.port=8081 # log config logging.config=classpath:logback.xml ### 調(diào)度中心部署跟地址 [選填]:如調(diào)度中心集群部署存在多個(gè)地址則用逗號分隔结闸。執(zhí)行器將會使用該地址進(jìn)行"執(zhí)行器心跳注冊"和"任務(wù)結(jié)果回調(diào)";為空則關(guān)閉自動(dòng)注冊 xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊分組依據(jù)酒朵;為空則關(guān)閉自動(dòng)注冊 xxl.job.executor.appname=xxl-job-executor-sample ### 執(zhí)行器IP [選填]:默認(rèn)為空表示自動(dòng)獲取IP桦锄,多網(wǎng)卡時(shí)可手動(dòng)設(shè)置指定IP,該IP不會綁定Host僅作為通訊實(shí)用耻讽;地址信息用于 "執(zhí)行器注冊" 和 "調(diào)度中心請求并觸發(fā)任務(wù)" xxl.job.executor.ip= ### 執(zhí)行器端口號 [選填]:小于等于0則自動(dòng)獲炔齑俊;默認(rèn)端口為9999,單機(jī)部署多個(gè)執(zhí)行器時(shí)饼记,注意要配置不同執(zhí)行器端口 xxl.job.executor.port=9999 ### 執(zhí)行器通訊TOKEN [選填]:非空時(shí)啟用 xxl.job.accessToken= ### 執(zhí)行器運(yùn)行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權(quán)限香伴;為空則使用默認(rèn)路徑 xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### 執(zhí)行器日志保存天數(shù) [選填] :值大于3時(shí)生效,啟用執(zhí)行器Log文件定期清理功能具则,否則不生效 xxl.job.executor.logretentiondays=-1
部署項(xiàng)目
官方提供了多種執(zhí)行器的示例項(xiàng)目即纲,這里默認(rèn)使用springboot。
執(zhí)行器集群(可選)
執(zhí)行器支持集群部署博肋,提升調(diào)度系統(tǒng)可用性低斋,同時(shí)提升任務(wù)處理能力。
執(zhí)行器集群部署時(shí)匪凡,幾點(diǎn)要求和建議:
- 執(zhí)行器回調(diào)地址(xxl.job.admin.addresses)需要保持一致膊畴;執(zhí)行器根據(jù)該配置進(jìn)行執(zhí)行器自動(dòng)注冊等操作。
- 同一個(gè)執(zhí)行器集群內(nèi)AppName(xxl.job.executor.appname)需要保持一致病游;調(diào)度中心根據(jù)該配置動(dòng)態(tài)發(fā)現(xiàn)不同集群的在線執(zhí)行器列表唇跨。
五、開發(fā)
任務(wù)運(yùn)行模式主要有Bean模式和Gule模式(理解為腳本)
BEAN模式
在該模式下衬衬,任務(wù)的具體實(shí)現(xiàn)邏輯是 以JobHandler的形式存在于“執(zhí)行器項(xiàng)目”中买猖。
- 步驟一:新建執(zhí)行器項(xiàng)目
這里只要copy 項(xiàng)目xxl-job-executor-sample-springboot
即可
- 步驟二:修改執(zhí)行器appname
logging:
config: "classpath:logback.xml"
server:
port: 8081
xxl:
job:
accessToken: ''
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
executor:
appname: xxl-job-executor-test
ip: ''
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: -1
port: 9999
- 步驟三:新建一個(gè)任務(wù)Handler:TestJobHandler
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* <p>Title:lyy-modular-saas-api</p>
* <p>Desc: 運(yùn)行模式為Bean模式</p>
* 開發(fā)步驟:
* 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í)行日志;
* @author Jerry
* @version 1.0
* @since 2019/8/8
*/
@JobHandler(value = "testJobHandler")
@Component
public class TestJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String s) throws Exception {
XxlJobLogger.log("################# start to job test");
for (int i = 0; i < 5; i++) {
XxlJobLogger.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
XxlJobLogger.log("################# end to job test");
return SUCCESS;
}
}
- 步驟四:執(zhí)行器管理耽梅,新增執(zhí)行器
- 步驟五:任務(wù)管理薛窥,新建調(diào)度任務(wù)
- 步驟六:執(zhí)行任務(wù),并查看日志
可以看到眼姐,這里成功執(zhí)行了先前自定義的調(diào)度任務(wù)诅迷,并輸出了log,結(jié)合代碼分析众旗,任務(wù)執(zhí)行的log通過XxlJobLogger.log
記錄并寫到日志表內(nèi)罢杉,調(diào)度中心后臺讀取日志表得到詳細(xì)的log
GLUE模式
任務(wù)以源碼方式維護(hù)在調(diào)度中心,支持通過Web IDE在線更新贡歧,實(shí)時(shí)編譯和生效滩租,因此不需要指定JobHandler
拿GULE模式(JAVA)來解釋赋秀,每一個(gè)GLUE模式的代碼,在“執(zhí)行器”接受到調(diào)度請求時(shí)律想,會通過Groovy類加載器加載出代碼猎莲,并實(shí)例化成Java對象,同時(shí)注入此代碼中聲明的Spring服務(wù)(這里要確保代碼中所引用的類或服務(wù)在“執(zhí)行器項(xiàng)目中存在”)技即,接著調(diào)用該對象的execute方法著洼,執(zhí)行具體的任務(wù)邏輯。
-
步驟一:任務(wù)管理而叼,新建調(diào)度任務(wù)
-
步驟二:點(diǎn)擊操作身笤,選擇GLUE IDE,進(jìn)入Web Ide界面
任務(wù)執(zhí)行失敗-郵件告警
- 步驟一:在之前
3.3.1 更改配置
中葵陵,有相關(guān)郵件報(bào)警的發(fā)送方配置液荸,配置即可
### 這里是用騰訊企業(yè)郵箱測試
spring.mail.host=smtp.exmail.qq.com
spring.mail.port=465
spring.mail.username=error@leyaoyao.com
spring.mail.password=123456
- 步驟二:在
任務(wù)管理,新建調(diào)度任務(wù)
中脱篙,配置接收告警郵件的郵箱莹弊,多個(gè)用“,”隔開即可
相關(guān)的處理邏輯在調(diào)度中心的JobFailMonitorHelper
類中
分片廣播&動(dòng)態(tài)分片
執(zhí)行器集群部署時(shí),任務(wù)路由策略選擇"分片廣播"情況下涡尘,一次任務(wù)調(diào)度將會廣播觸發(fā)對應(yīng)集群中所有執(zhí)行器執(zhí)行一次任務(wù),同時(shí)系統(tǒng)自動(dòng)傳遞分片參數(shù)响迂;可根據(jù)分片參數(shù)開發(fā)分片任務(wù)考抄。
使用場景:
分片任務(wù)場景:10個(gè)執(zhí)行器的集群來處理10w條數(shù)據(jù),每臺機(jī)器只需要處理1w條數(shù)據(jù)蔗彤,耗時(shí)降低10倍川梅;
廣播任務(wù)場景:廣播執(zhí)行器機(jī)器運(yùn)行shell腳本、廣播集群節(jié)點(diǎn)進(jìn)行緩存更新等
-
步驟一:執(zhí)行器集群部署然遏,暫設(shè)置為2個(gè)節(jié)點(diǎn)
執(zhí)行器管理可以看到:一個(gè)APP有兩個(gè)機(jī)器地址
actuators.jpg
-
步驟二:新增or更新任務(wù)贫途,更改路由策略為分片廣播
broadcast.jpg
-
步驟三:編寫業(yè)務(wù)代碼
// 分片參數(shù) ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); log.info("分片參數(shù):當(dāng)前分片序號 = {}, 總分片數(shù) = {}", shardingVO.getIndex(), shardingVO.getTotal()); XxlJobLogger.log("分片參數(shù)1:當(dāng)前分片序號 = {}, 總分片數(shù) = {}", shardingVO.getIndex(), shardingVO.getTotal()); // 業(yè)務(wù)邏輯 // ...
-
步驟四:執(zhí)行任務(wù),查看運(yùn)行日志
# 節(jié)點(diǎn)1 2019-08-09 09:21:38 [com.xxl.job.executor.service.jobhandler.ShardingJobHandler#execute]-[30]-[Thread-14] 分片參數(shù):當(dāng)前分片序號 = 0, 總分片數(shù) = 2 2019-08-09 09:21:38 [com.xxl.job.executor.service.jobhandler.ShardingJobHandler#execute]-[35]-[Thread-14] 第 0 片, 命中分片開始處理 2019-08-09 09:21:38 [com.xxl.job.executor.service.jobhandler.ShardingJobHandler#execute]-[37]-[Thread-14] 第 1 片, 忽略 # 節(jié)點(diǎn)2 2019-08-09 09:21:38 [com.lyyopen.saas.service.jobhandler.ShardingJobHandler#execute]-[29]-[Thread-16] 分片參數(shù)1:當(dāng)前分片序號 = 1, 總分片數(shù) = 2 2019-08-09 09:21:38 [com.lyyopen.saas.service.jobhandler.ShardingJobHandler#execute]-[36]-[Thread-16] 第 0 片, 忽略 2019-08-09 09:21:38 [com.lyyopen.saas.service.jobhandler.ShardingJobHandler#execute]-[34]-[Thread-16] 第 1 片, 命中分片開始處理
可以看到一個(gè)集群的兩個(gè)節(jié)點(diǎn)都收到了分片調(diào)度請求待侵,業(yè)務(wù)邏輯即可針對對應(yīng)的分片序號進(jìn)行業(yè)務(wù)邏輯分片處理丢早!
六、架構(gòu)設(shè)計(jì)
設(shè)計(jì)思想
實(shí)現(xiàn) 調(diào)度+任務(wù)
兩者解耦
調(diào)度行為在調(diào)度中心(admin后臺)秧倾,負(fù)責(zé)發(fā)起調(diào)度請求
任務(wù)抽象化為一個(gè)個(gè)JobHandler怨酝,交由“
執(zhí)行器
”統(tǒng)一管理,“執(zhí)行器
”負(fù)責(zé)接收調(diào)度請求并找到對應(yīng)的JobHandler那先,執(zhí)行具體的業(yè)務(wù)邏輯(execute)
系統(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ù)模塊; 支持可視化揍堕、簡單且動(dòng)態(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í)行請求慎颗、終止請求和日志請求等乡恕。
架構(gòu)圖
架構(gòu)特性
-
解耦
調(diào)度中心
通過類rpc的調(diào)用模式,調(diào)用執(zhí)行器
暴露的遠(yuǎn)程服務(wù)俯萎;詳見日志遠(yuǎn)程調(diào)用源碼:
com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean#getObject
-
線程池
調(diào)度采用線程池方式實(shí)現(xiàn)傲宜,避免用單線程出現(xiàn)阻塞而導(dǎo)致任務(wù)調(diào)度延遲;
-
并行調(diào)度
調(diào)度模塊采用并行機(jī)制夫啊,而調(diào)度傳遞到
執(zhí)行器
則是串行執(zhí)行 多種路由策略
-
過期處理策略
過期5s內(nèi)立即觸發(fā)一次函卒,過期超5s則忽略
-
日志回調(diào)服務(wù)
“執(zhí)行器”
在收到調(diào)度請求并執(zhí)行任務(wù)后,會將任務(wù)的執(zhí)行結(jié)果回調(diào)通知給調(diào)度中心撇眯,調(diào)度中心再對應(yīng)更新日志表报嵌。執(zhí)行器觸發(fā)回調(diào)線程處理源碼:
com.xxl.job.core.thread.TriggerCallbackThread#doCallback
調(diào)度中心接受回調(diào)源碼:
com.xxl.job.admin.service.impl.AdminBizImpl#callback(com.xxl.job.core.biz.model.HandleCallbackParam)
-
任務(wù)集群
執(zhí)行器如若集群部署,調(diào)度中心將會感知到在線的所有執(zhí)行器
-
全異步化
- 異步調(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ào)度中心
向執(zhí)行器
發(fā)送http調(diào)度請求: “執(zhí)行器”中接收請求的服務(wù),實(shí)際上是一臺內(nèi)嵌Server转质,默認(rèn)端口9999; -
執(zhí)行器
執(zhí)行任務(wù)邏輯 -
執(zhí)行器
http回調(diào)調(diào)度中心
調(diào)度結(jié)果:調(diào)度中心
中接收回調(diào)的服務(wù)园欣,是針對執(zhí)行器
開放一套API服務(wù);