xxl-job的github地址:https://github.com/xuxueli/xxl-job
運(yùn)行環(huán)境:Maven3+; Jdk1.8+; Mysql5.7+
一. 快速使用
1. 初始化數(shù)據(jù)庫
sql文件存放路徑:/xxl-job/doc/db/tables_xxl_job.sql
2. 源碼結(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-frameless:無框架版本;
3. 快速啟動(dòng)
3.1 xxl-job-admin:調(diào)度中心
調(diào)度中心項(xiàng)目:xxl-job-admin
作用:統(tǒng)一管理任務(wù)調(diào)度平臺上調(diào)度任務(wù),負(fù)責(zé)觸發(fā)調(diào)度執(zhí)行,并且提供任務(wù)管理平臺。
3.1.1 配置文件
所在路徑:/xxl-job/xxl-job-admin/src/main/resources/application.properties
### 調(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
### 報(bào)警郵箱
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 [選填]:非空時(shí)啟用;
xxl.job.accessToken=
### 調(diào)度中心國際化配置 [必填]: 默認(rèn)為 "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ù) [必填]:過期日志自動(dòng)清理;限制大于等于7時(shí)生效,否則, 如-1,關(guān)閉自動(dòng)清理功能;
xxl.job.logretentiondays=30
3.1.2 啟動(dòng)
調(diào)度中心訪問地址:ip:端口號/項(xiàng)目名
默認(rèn)登錄賬號/密碼: admin/123456
登錄之后頁面如下所示:

3.2 配置部署“執(zhí)行器項(xiàng)目”
“執(zhí)行器”項(xiàng)目:xxl-job-executor-sample-springboot (提供多種版本執(zhí)行器供選擇,現(xiàn)以 springboot 版本為例,可直接使用,也可以參考其并將現(xiàn)有項(xiàng)目改造成執(zhí)行器)
作用:負(fù)責(zé)接收“調(diào)度中心”的調(diào)度并執(zhí)行;可直接部署執(zhí)行器,也可以將執(zhí)行器集成到現(xiàn)有業(yè)務(wù)項(xiàng)目中。
3.2.1 xxl-job-core的maven依賴
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新穩(wěn)定版本}</version>
</dependency>
3.2.2 配置文件
所在路徑:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
### 調(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í)行器通訊TOKEN [選填]:非空時(shí)啟用;
xxl.job.accessToken=
### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊分組依據(jù);為空則關(guān)閉自動(dòng)注冊
xxl.job.executor.appname=xxl-job-executor-sample
### 執(zhí)行器注冊 [選填]:優(yōu)先使用該配置作為注冊地址,為空時(shí)使用內(nèi)嵌服務(wù) ”IP:PORT“ 作為注冊地址。從而更靈活的支持容器類型執(zhí)行器動(dòng)態(tài)IP和動(dòng)態(tài)映射端口問題。
xxl.job.executor.address=
### 執(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í)行器運(yùn)行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權(quán)限;為空則使用默認(rèn)路徑;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 執(zhí)行器日志文件保存天數(shù) [選填] : 過期日志自動(dòng)清理, 限制值大于等于3時(shí)生效; 否則, 如-1, 關(guān)閉自動(dòng)清理功能;
xxl.job.executor.logretentiondays=30
3.2.3 啟動(dòng)
修改好配置文件之后,直接運(yùn)行,在“任務(wù)調(diào)度中心”中的“執(zhí)行器管理”頁面新增執(zhí)行器,其中AppName對應(yīng)配置文件中的xxl.job.executor.appname=,名稱自定義,注冊方式(自動(dòng)注冊可以自動(dòng)獲取對應(yīng)AppName的ip:port,也可以手動(dòng)錄入執(zhí)行器地址)


3.3 新建任務(wù)
- 在“執(zhí)行器項(xiàng)目”中新建一個(gè)java類文件,使用
@Component注解實(shí)現(xiàn)"bean注入"; - 在類文件中新建個(gè)方法,使用
@XxlJob(value = "")注解聲明定時(shí)任務(wù),其中value的值對應(yīng)任務(wù)配置中的JobHandler
代碼范例:
@Component
public class MyXxlJobDemo {
@XxlJob("demoJobHandler")
public void demoJobHandler() {
/**定時(shí)任務(wù)具體實(shí)現(xiàn)**/
}
}


- 注:配置屬性詳細(xì)說明
基礎(chǔ)配置:
- 執(zhí)行器:任務(wù)的綁定的執(zhí)行器,任務(wù)觸發(fā)調(diào)度時(shí)將會自動(dòng)發(fā)現(xiàn)注冊成功的執(zhí)行器, 實(shí)現(xiàn)任務(wù)自動(dòng)發(fā)現(xiàn)功能; 另一方面也可以方便的進(jìn)行任務(wù)分組。每個(gè)任務(wù)必須綁定一個(gè)執(zhí)行器, 可在 "執(zhí)行器管理" 進(jìn)行設(shè)置;
- 任務(wù)描述:任務(wù)的描述信息,便于任務(wù)管理;
- 負(fù)責(zé)人:任務(wù)的負(fù)責(zé)人;
- 報(bào)警郵件:任務(wù)調(diào)度失敗時(shí)郵件通知的郵箱地址,支持配置多郵箱地址,配置多個(gè)郵箱地址時(shí)用逗號分隔;
觸發(fā)配置:
- 調(diào)度類型:
無:該類型不會主動(dòng)觸發(fā)調(diào)度;
CRON:該類型將會通過CRON,觸發(fā)任務(wù)調(diào)度;
固定速度:該類型將會以固定速度,觸發(fā)任務(wù)調(diào)度;按照固定的間隔時(shí)間,周期性觸發(fā);
固定延遲:該類型將會以固定延遲,觸發(fā)任務(wù)調(diào)度;按照固定的延遲時(shí)間,從上次調(diào)度結(jié)束后開始計(jì)算延遲時(shí)間,到達(dá)延遲時(shí)間后觸發(fā)下次調(diào)度;
- CRON:觸發(fā)任務(wù)執(zhí)行的Cron表達(dá)式;
- 固定速度:固件速度的時(shí)間間隔,單位為秒;
- 固定延遲:固件延遲的時(shí)間間隔,單位為秒;
任務(wù)配置:
- 運(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值;
- 執(zhí)行參數(shù):任務(wù)執(zhí)行所需的參數(shù);
高級配置:
- 路由策略:當(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í)系統(tǒng)自動(dòng)傳遞分片參數(shù);可根據(jù)分片參數(shù)開發(fā)分片任務(wù);
- 子任務(wù):每個(gè)任務(wù)都擁有一個(gè)唯一的任務(wù)ID(任務(wù)ID可以從任務(wù)列表獲取),當(dāng)本任務(wù)執(zhí)行結(jié)束并且執(zhí)行成功時(shí),將會觸發(fā)子任務(wù)ID所對應(yīng)的任務(wù)的一次主動(dòng)調(diào)度。
- 調(diào)度過期策略:
- 忽略:調(diào)度過期后,忽略過期的任務(wù),從當(dāng)前時(shí)間開始重新計(jì)算下次觸發(fā)時(shí)間;
- 立即執(zhí)行一次:調(diào)度過期后,立即執(zhí)行一次,并從當(dāng)前時(shí)間開始重新計(jì)算下次觸發(fā)時(shí)間;
- 阻塞處理策略:調(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ù)超時(shí)時(shí)間:支持自定義任務(wù)超時(shí)時(shí)間,任務(wù)運(yùn)行超時(shí)將會主動(dòng)中斷任務(wù);
- 失敗重試次數(shù);支持自定義任務(wù)失敗重試次數(shù),當(dāng)任務(wù)失敗時(shí)將會按照預(yù)設(shè)的失敗重試次數(shù)主動(dòng)進(jìn)行重試;
記遇到的問題: XXL-JOB配置遷移到Nacos Could not resolve placeholder ‘xxl.job.accessToken’ in value “${xxl.job.accessToke}
解決辦法:對配置項(xiàng)中的空值加雙引號("")
xxl:
job:
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
accessToken: ""
executor:
appname: xxl-job-executor-sample
address: ""
ip: ""
port: 9999
logpath: ./log
logretentiondays: 1
4. 實(shí)際應(yīng)用
- 手動(dòng)觸發(fā)定時(shí)任務(wù),Java代碼接收"任務(wù)參數(shù)"
String jobParam = XxlJobHelper.getJobParam();