1. 程式人生 > 其它 >xxl-job學習筆記

xxl-job學習筆記

xxl-job學習筆記和問題總結

為什麼?

目前專案中,採用的是微服務框架,由於在微服務中,存在需要定時的任務。但如果定時任務維護在每個微服務下,當微服務部署多個例項的情況下,會出現定時任務多次執行的情況。並且在解決問題的基礎上,希望能夠實現動態修改任務的定時時間,可以通過頁面對定時任務進行控制

是什麼?

XXL-JOB是一個輕量級分散式任務排程平臺

顧名思義,首先是 任務排程平臺 ,對專案中的定時任務進行排程管理的一個後臺監控管理平臺(類似於鐵路行車排程後臺管理系統)通過該平臺提供的管理頁面就可以實現對整個專案中的定時任務進行控制、排程的功能

其次是 分散式 ,如上一節所說,當前的專案採用的是微服務框架,一個專案有多個微服務並且每個微服務可能存在多個例項,整個專案是一個非常龐大的分散式系統,針對分散式系統提出的任務排程平臺自然就是分散式任務排程平臺

平臺主要分為兩部分:

  • 排程中心

    作用:統一管理任務排程平臺上排程任務,負責觸發排程執行,並且提供任務管理平臺,現成的提供使用的一個管理員端(排程平臺)Web專案

  • 執行器

    作用:負責接收 排程中心 的排程並執行;可直接部署執行器,也可以將執行器整合到現有業務專案中

怎麼用?

搭建排程中心

1)下載排程中心原始碼並解壓(xxl-job-admin專案即為排程中心),專案結構如下:

xxl-job-admin:排程中心
xxl-job-core:公共依賴
xxl-job-executor-samples:執行器Sample示例(選擇合適的版本執行器,可直接使用,也可以參考其並將現有專案改造成執行器)
    :xxl-job-executor-sample-springboot:Springboot版本,通過Springboot管理執行器,推薦這種方式;
    :xxl-job-executor-sample-frameless:無框架版本;

2)初始化sql指令碼,指令碼位置: /xxl-job/doc/db/tables_xxl_job.sql

3)更改配置中心配置,配置檔案位置: /xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties

配置項說明:


### 排程中心JDBC連結:連結地址請保持和排程資料庫的地址一致

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
[email protected]
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

### 排程中心通訊TOKEN [選填]:非空時啟用;

xxl.job.accessToken=

### 排程中心國際化配置 [必填]: 預設為 "zh_CN"/中文簡體, 可選範圍為 "zh_CN"/中文簡體, "zh_TC"/中文繁體 and "en"/英文;

xxl.job.i18n=zh_CN

## 排程執行緒池最大執行緒配置【必填】

xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100

### 排程中心日誌表資料儲存天數 [必填]:過期日誌自動清理;限制大於等於7時生效,否則, 如-1,關閉自動清理功能;

xxl.job.logretentiondays=30

4)如果已經正確進行上述配置,可將專案編譯打包部署。
排程中心訪問地址: http://localhost:8080/xxl-job-admin (該地址執行器將會使用到,作為回撥地址) 預設登入賬號 admin/123456

搭建執行器專案

1)確認pom檔案中引入了 xxl-job-core 的依賴

2)執行器配置,樣例專案中配置檔案位置: /xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

配置項說明:


### 排程中心部署跟地址 [選填]:如排程中心叢集部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回撥";為空則關閉自動註冊;

xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### 執行器通訊TOKEN [選填]:非空時啟用;

xxl.job.accessToken=

### 執行器AppName [選填]:執行器心跳註冊分組依據;為空則關閉自動註冊

xxl.job.executor.appname=xxl-job-executor-sample

### 執行器註冊 [選填]:優先使用該配置作為註冊地址,為空時使用內嵌服務 ”IP:PORT“ 作為註冊地址。從而更靈活的支援容器型別執行器動態IP和動態對映埠問題。

xxl.job.executor.address=

### 執行器IP [選填]:預設為空表示自動獲取IP,多網絡卡時可手動設定指定IP,該IP不會繫結Host僅作為通訊實用;地址資訊用於 "執行器註冊" 和 "排程中心請求並觸發任務";

xxl.job.executor.ip=

### 執行器埠號 [選填]:小於等於0則自動獲取;預設埠為9999,單機部署多個執行器時,注意要配置不同執行器埠;

xxl.job.executor.port=9999

### 執行器執行日誌檔案儲存磁碟路徑 [選填] :需要對該路徑擁有讀寫許可權;為空則使用預設路徑;

xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler

### 執行器日誌檔案儲存天數 [選填] : 過期日誌自動清理, 限制值大於等於3時生效; 否則, 如-1, 關閉自動清理功能;

xxl.job.executor.logretentiondays=30

3)執行器元件配置,樣例專案中配置檔案位置: /xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java

配置內容說明:

@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;
}

4)建立任務JobHandler,專案中已提供的示例,位置: /xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java ,該例項採用的是 Bean模式(方法形式) ,可以參照建立自己的handler處理類

5)在排程中心對定時任務執行進行配置,配置規則詳情:

基礎配置:
  - 執行器:任務的繫結的執行器,任務觸發排程時將會自動發現註冊成功的執行器, 實現任務自動發現功能; 另一方面也可以方便的進行任務分組。每個任務必須繫結一個執行器, 可在 "執行器管理" 進行設定;
  - 任務描述:任務的描述資訊,便於任務管理;
  - 負責人:任務的負責人;
  - 報警郵件:任務排程失敗時郵件通知的郵箱地址,支援配置多郵箱地址,配置多個郵箱地址時用逗號分隔;

觸發配置:
  - 排程型別:
      無:該型別不會主動觸發排程;
      CRON:該型別將會通過CRON,觸發任務排程;
      固定速度:該型別將會以固定速度,觸發任務排程;按照固定的間隔時間,週期性觸發;
      固定延遲:該型別將會以固定延遲,觸發任務排程;按照固定的延遲時間,從上次排程結束後開始計算延遲時間,到達延遲時間後觸發下次排程;
  - CRON:觸發任務執行的Cron表示式;
  - 固定速度:韌體速度的時間間隔,單位為秒;
  - 固定延遲:韌體延遲的時間間隔,單位為秒;

任務配置:
  - 執行模式:
      BEAN模式:任務以JobHandler方式維護在執行器端;需要結合 "JobHandler" 屬性匹配執行器中任務;
      GLUE模式(Java):任務以原始碼方式維護在排程中心;該模式的任務實際上是一段繼承自IJobHandler的Java類程式碼並 "groovy" 原始碼方式維護,它在執行器專案中執行,可使用@Resource/@Autowire注入執行器裡中的其他服務;
      GLUE模式(Shell):任務以原始碼方式維護在排程中心;該模式的任務實際上是一段 "shell" 指令碼;
      GLUE模式(Python):任務以原始碼方式維護在排程中心;該模式的任務實際上是一段 "python" 指令碼;
      GLUE模式(PHP):任務以原始碼方式維護在排程中心;該模式的任務實際上是一段 "php" 指令碼;
      GLUE模式(NodeJS):任務以原始碼方式維護在排程中心;該模式的任務實際上是一段 "nodejs" 指令碼;
      GLUE模式(PowerShell):任務以原始碼方式維護在排程中心;該模式的任務實際上是一段 "PowerShell" 指令碼;
  - JobHandler:執行模式為 "BEAN模式" 時生效,對應執行器中新開發的JobHandler類“@JobHandler”註解自定義的value值;
  - 執行引數:任務執行所需的引數;     
  
高階配置:
  - 路由策略:當執行器叢集部署時,提供豐富的路由策略,包括;
      FIRST(第一個):固定選擇第一個機器;
      LAST(最後一個):固定選擇最後一個機器;
      ROUND(輪詢):;
      RANDOM(隨機):隨機選擇線上的機器;
      CONSISTENT_HASH(一致性HASH):每個任務按照Hash演算法固定選擇某一臺機器,且所有任務均勻雜湊在不同機器上。
      LEAST_FREQUENTLY_USED(最不經常使用):使用頻率最低的機器優先被選舉;
      LEAST_RECENTLY_USED(最近最久未使用):最久未使用的機器優先被選舉;
      FAILOVER(故障轉移):按照順序依次進行心跳檢測,第一個心跳檢測成功的機器選定為目標執行器併發起排程;
      BUSYOVER(忙碌轉移):按照順序依次進行空閒檢測,第一個空閒檢測成功的機器選定為目標執行器併發起排程;
      SHARDING_BROADCAST(分片廣播):廣播觸發對應叢集中所有機器執行一次任務,同時系統自動傳遞分片引數;可根據分片引數開發分片任務;
  - 子任務:每個任務都擁有一個唯一的任務ID(任務ID可以從任務列表獲取),當本任務執行結束並且執行成功時,將會觸發子任務ID所對應的任務的一次主動排程。
  - 排程過期策略:
      - 忽略:排程過期後,忽略過期的任務,從當前時間開始重新計算下次觸發時間;
      - 立即執行一次:排程過期後,立即執行一次,並從當前時間開始重新計算下次觸發時間;
  - 阻塞處理策略:排程過於密集執行器來不及處理時的處理策略;
      單機序列(預設):排程請求進入單機執行器後,排程請求進入FIFO佇列並以序列方式執行;
      丟棄後續排程:排程請求進入單機執行器後,發現執行器存在執行的排程任務,本次請求將會被丟棄並標記為失敗;
      覆蓋之前排程:排程請求進入單機執行器後,發現執行器存在執行的排程任務,將會終止執行中的排程任務並清空佇列,然後執行本地排程任務;
  - 任務超時時間:支援自定義任務超時時間,任務執行超時將會主動中斷任務;
  - 失敗重試次數;支援自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;

詳細參考:官方文件