xxl-job的github地址:https://github.com/xuxueli/xxl-job
運行環(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)有項目改造成執(zhí)行器)xxl-job-executor-sample-springboot:Springboot版本汰聋,通過Springboot管理執(zhí)行器髓梅,推薦這種方式奢方;
xxl-job-executor-sample-frameless:無框架版本鹊奖;
3. 快速啟動
3.1 xxl-job-admin:調(diào)度中心
調(diào)度中心項目: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
### 報警郵箱
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)度中心國際化配置 [必填]: 默認(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ù) [必填]:過期日志自動清理幔摸;限制大于等于7時生效,否則, 如-1援所,關(guān)閉自動清理功能摊求;
xxl.job.logretentiondays=30
3.1.2 啟動
調(diào)度中心訪問地址:ip:端口號/項目名
默認(rèn)登錄賬號/密碼: admin/123456
登錄之后頁面如下所示:
3.2 配置部署“執(zhí)行器項目”
“執(zhí)行器”項目:xxl-job-executor-sample-springboot (提供多種版本執(zhí)行器供選擇,現(xiàn)以 springboot 版本為例弹澎,可直接使用,也可以參考其并將現(xiàn)有項目改造成執(zhí)行器)
作用:負(fù)責(zé)接收“調(diào)度中心”的調(diào)度并執(zhí)行竿屹;可直接部署執(zhí)行器,也可以將執(zhí)行器集成到現(xiàn)有業(yè)務(wù)項目中夯膀。
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)度中心集群部署存在多個地址則用逗號分隔格仲。執(zhí)行器將會使用該地址進(jìn)行"執(zhí)行器心跳注冊"和"任務(wù)結(jié)果回調(diào)"圈盔;為空則關(guān)閉自動注冊掸冤;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 執(zhí)行器通訊TOKEN [選填]:非空時啟用友雳;
xxl.job.accessToken=
### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊分組依據(jù)稿湿;為空則關(guān)閉自動注冊
xxl.job.executor.appname=xxl-job-executor-sample
### 執(zhí)行器注冊 [選填]:優(yōu)先使用該配置作為注冊地址,為空時使用內(nèi)嵌服務(wù) ”IP:PORT“ 作為注冊地址押赊。從而更靈活的支持容器類型執(zhí)行器動態(tài)IP和動態(tài)映射端口問題饺藤。
xxl.job.executor.address=
### 執(zhí)行器IP [選填]:默認(rèn)為空表示自動獲取IP,多網(wǎng)卡時可手動設(shè)置指定IP,該IP不會綁定Host僅作為通訊實用涕俗;地址信息用于 "執(zhí)行器注冊" 和 "調(diào)度中心請求并觸發(fā)任務(wù)"罗丰;
xxl.job.executor.ip=
### 執(zhí)行器端口號 [選填]:小于等于0則自動獲取再姑;默認(rèn)端口為9999萌抵,單機部署多個執(zhí)行器時,注意要配置不同執(zhí)行器端口元镀;
xxl.job.executor.port=9999
### 執(zhí)行器運行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權(quán)限绍填;為空則使用默認(rèn)路徑;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 執(zhí)行器日志文件保存天數(shù) [選填] : 過期日志自動清理, 限制值大于等于3時生效; 否則, 如-1, 關(guān)閉自動清理功能栖疑;
xxl.job.executor.logretentiondays=30
3.2.3 啟動
修改好配置文件之后讨永,直接運行,在“任務(wù)調(diào)度中心”中的“執(zhí)行器管理”頁面新增執(zhí)行器蔽挠,其中AppName
對應(yīng)配置文件中的xxl.job.executor.appname=
住闯,名稱自定義,注冊方式(自動注冊可以自動獲取對應(yīng)AppName
的ip:port
澳淑,也可以手動錄入執(zhí)行器地址)
3.3 新建任務(wù)
- 在“執(zhí)行器項目”中新建一個java類文件,使用
@Component
注解實現(xiàn)"bean注入"插佛; - 在類文件中新建個方法杠巡,使用
@XxlJob(value = "")
注解聲明定時任務(wù),其中value的值對應(yīng)任務(wù)配置中的JobHandler
代碼范例:
@Component
public class MyXxlJobDemo {
@XxlJob("demoJobHandler")
public void demoJobHandler() {
/**定時任務(wù)具體實現(xiàn)**/
}
}
- 注:配置屬性詳細(xì)說明
基礎(chǔ)配置:
- 執(zhí)行器:任務(wù)的綁定的執(zhí)行器雇寇,任務(wù)觸發(fā)調(diào)度時將會自動發(fā)現(xiàn)注冊成功的執(zhí)行器, 實現(xiàn)任務(wù)自動發(fā)現(xiàn)功能; 另一方面也可以方便的進(jìn)行任務(wù)分組氢拥。每個任務(wù)必須綁定一個執(zhí)行器, 可在 "執(zhí)行器管理" 進(jìn)行設(shè)置;
- 任務(wù)描述:任務(wù)的描述信息,便于任務(wù)管理锨侯;
- 負(fù)責(zé)人:任務(wù)的負(fù)責(zé)人嫩海;
- 報警郵件:任務(wù)調(diào)度失敗時郵件通知的郵箱地址,支持配置多郵箱地址囚痴,配置多個郵箱地址時用逗號分隔叁怪;
觸發(fā)配置:
- 調(diào)度類型:
無:該類型不會主動觸發(fā)調(diào)度;
CRON:該類型將會通過CRON深滚,觸發(fā)任務(wù)調(diào)度奕谭;
固定速度:該類型將會以固定速度,觸發(fā)任務(wù)調(diào)度痴荐;按照固定的間隔時間血柳,周期性觸發(fā);
固定延遲:該類型將會以固定延遲生兆,觸發(fā)任務(wù)調(diào)度难捌;按照固定的延遲時間,從上次調(diào)度結(jié)束后開始計算延遲時間,到達(dá)延遲時間后觸發(fā)下次調(diào)度根吁;
- CRON:觸發(fā)任務(wù)執(zhí)行的Cron表達(dá)式员淫;
- 固定速度:固件速度的時間間隔,單位為秒婴栽;
- 固定延遲:固件延遲的時間間隔满粗,單位為秒;
任務(wù)配置:
- 運行模式:
BEAN模式:任務(wù)以JobHandler方式維護(hù)在執(zhí)行器端愚争;需要結(jié)合 "JobHandler" 屬性匹配執(zhí)行器中任務(wù)映皆;
GLUE模式(Java):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實際上是一段繼承自IJobHandler的Java類代碼并 "groovy" 源碼方式維護(hù)轰枝,它在執(zhí)行器項目中運行捅彻,可使用@Resource/@Autowire注入執(zhí)行器里中的其他服務(wù);
GLUE模式(Shell):任務(wù)以源碼方式維護(hù)在調(diào)度中心鞍陨;該模式的任務(wù)實際上是一段 "shell" 腳本步淹;
GLUE模式(Python):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實際上是一段 "python" 腳本诚撵;
GLUE模式(PHP):任務(wù)以源碼方式維護(hù)在調(diào)度中心缭裆;該模式的任務(wù)實際上是一段 "php" 腳本;
GLUE模式(NodeJS):任務(wù)以源碼方式維護(hù)在調(diào)度中心寿烟;該模式的任務(wù)實際上是一段 "nodejs" 腳本澈驼;
GLUE模式(PowerShell):任務(wù)以源碼方式維護(hù)在調(diào)度中心;該模式的任務(wù)實際上是一段 "PowerShell" 腳本筛武;
- JobHandler:運行模式為 "BEAN模式" 時生效缝其,對應(yīng)執(zhí)行器中新開發(fā)的JobHandler類“@JobHandler”注解自定義的value值;
- 執(zhí)行參數(shù):任務(wù)執(zhí)行所需的參數(shù)徘六;
高級配置:
- 路由策略:當(dāng)執(zhí)行器集群部署時内边,提供豐富的路由策略,包括待锈;
FIRST(第一個):固定選擇第一個機器漠其;
LAST(最后一個):固定選擇最后一個機器;
ROUND(輪詢):炉擅;
RANDOM(隨機):隨機選擇在線的機器辉懒;
CONSISTENT_HASH(一致性HASH):每個任務(wù)按照Hash算法固定選擇某一臺機器,且所有任務(wù)均勻散列在不同機器上谍失。
LEAST_FREQUENTLY_USED(最不經(jīng)常使用):使用頻率最低的機器優(yōu)先被選舉眶俩;
LEAST_RECENTLY_USED(最近最久未使用):最久未使用的機器優(yōu)先被選舉;
FAILOVER(故障轉(zhuǎn)移):按照順序依次進(jìn)行心跳檢測快鱼,第一個心跳檢測成功的機器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度颠印;
BUSYOVER(忙碌轉(zhuǎn)移):按照順序依次進(jìn)行空閑檢測纲岭,第一個空閑檢測成功的機器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度;
SHARDING_BROADCAST(分片廣播):廣播觸發(fā)對應(yīng)集群中所有機器執(zhí)行一次任務(wù)线罕,同時系統(tǒng)自動傳遞分片參數(shù)止潮;可根據(jù)分片參數(shù)開發(fā)分片任務(wù);
- 子任務(wù):每個任務(wù)都擁有一個唯一的任務(wù)ID(任務(wù)ID可以從任務(wù)列表獲取)钞楼,當(dāng)本任務(wù)執(zhí)行結(jié)束并且執(zhí)行成功時喇闸,將會觸發(fā)子任務(wù)ID所對應(yīng)的任務(wù)的一次主動調(diào)度。
- 調(diào)度過期策略:
- 忽略:調(diào)度過期后询件,忽略過期的任務(wù)燃乍,從當(dāng)前時間開始重新計算下次觸發(fā)時間;
- 立即執(zhí)行一次:調(diào)度過期后宛琅,立即執(zhí)行一次刻蟹,并從當(dāng)前時間開始重新計算下次觸發(fā)時間;
- 阻塞處理策略:調(diào)度過于密集執(zhí)行器來不及處理時的處理策略嘿辟;
單機串行(默認(rèn)):調(diào)度請求進(jìn)入單機執(zhí)行器后舆瘪,調(diào)度請求進(jìn)入FIFO隊列并以串行方式運行;
丟棄后續(xù)調(diào)度:調(diào)度請求進(jìn)入單機執(zhí)行器后红伦,發(fā)現(xiàn)執(zhí)行器存在運行的調(diào)度任務(wù)英古,本次請求將會被丟棄并標(biāo)記為失敗昙读;
覆蓋之前調(diào)度:調(diào)度請求進(jìn)入單機執(zhí)行器后哺呜,發(fā)現(xiàn)執(zhí)行器存在運行的調(diào)度任務(wù),將會終止運行中的調(diào)度任務(wù)并清空隊列箕戳,然后運行本地調(diào)度任務(wù);
- 任務(wù)超時時間:支持自定義任務(wù)超時時間国撵,任務(wù)運行超時將會主動中斷任務(wù)陵吸;
- 失敗重試次數(shù);支持自定義任務(wù)失敗重試次數(shù)介牙,當(dāng)任務(wù)失敗時將會按照預(yù)設(shè)的失敗重試次數(shù)主動進(jìn)行重試壮虫;
記遇到的問題: XXL-JOB配置遷移到Nacos Could not resolve placeholder ‘xxl.job.accessToken’ in value “${xxl.job.accessToke}
解決辦法:對配置項中的空值加雙引號("")
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. 實際應(yīng)用
- 手動觸發(fā)定時任務(wù),Java代碼接收"任務(wù)參數(shù)"
String jobParam = XxlJobHelper.getJobParam();