xxl-job簡單應(yīng)用

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
登錄之后頁面如下所示:


任務(wù)調(diào)度中心

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)AppNameip:port,也可以手動(dòng)錄入執(zhí)行器地址)

新增執(zhí)行器

執(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)**/
    }
}
任務(wù)管理列表

新增任務(wù)
  • 注:配置屬性詳細(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();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容