分佈式任務調度框架xxljob2.2.0詳細安裝使用教程

簡介

概述

XXL-JOB是一個分佈式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼並接入多家公司線上產品線,開箱即用。

特性

  1. 簡單:支持通過Web頁面對任務進行CRUD操作,操作簡單,一分鐘上手。
  2. 動態:支持動態修改任務狀態、啓動/停止任務,以及終止運行中任務,即時生效。
  3. 調度中心HA(中心式):調度採用中心式設計,“調度中心”自研調度組件並支持集羣部署,可保證調度中心HA。
  4. 執行器HA(分佈式):任務分佈式執行,任務”執行器”支持集羣部署,可保證任務執行HA。
  5. 註冊中心: 執行器會週期性自動註冊任務, 調度中心將會自動發現註冊的任務並觸發執行。同時,也支持手動錄入執行器地址。
  6. 彈性擴容縮容:一旦有新執行器機器上線或者下線,下次調度時將會重新分配任務。
  7. 觸發策略:提供豐富的任務觸發策略,包括:Cron觸發、固定間隔觸發、固定延時觸發、API(事件)觸發、人工觸發、父子任務觸發。
  8. 調度過期策略:調度中心錯過調度時間的補償處理策略,包括:忽略、立即補償觸發一次等。
  9. 阻塞處理策略:調度過於密集,執行器來不及處理時的處理策略,策略包括:單機串行(默認)、丟棄後續調度、覆蓋之前調度。
  10. 任務超時控制:支持自定義任務超時時間,任務運行超時將會主動中斷任務。
  11. 任務失敗重試:支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;其中分片任務支持分片粒度的失敗重試 。
  12. 任務失敗告警;默認提供郵件方式失敗告警,同時預留擴展接口,可方便的擴展短信、釘釘等告警方式
  13. 路由策略:執行器集羣部署時提供豐富的路由策略,包括:第一個、最後一個、輪詢、隨機、一致性HASH、最不經常使用、最近最久未使用、故障轉移、忙碌轉移等。
  14. 分片廣播任務:執行器集羣部署時,任務路由策略選擇”分片廣播”情況下,一次任務調度將會廣播觸發集羣中所有執行器執行一次任務,可根據分片參數開發分片任務。
  15. 動態分片:分片廣播任務以執行器爲維度進行分片,支持動態擴容執行器集羣從而動態增加分片數量,協同進行業務處理;在進行大數據量業務操作時可顯著提升任務處理能力和速度。
  16. 故障轉移:任務路由策略選擇”故障轉移”情況下,如果執行器集羣中某一臺機器故障,將會自動Failover切換到一臺正常的執行器發送調度請求。
  17. 任務進度監控:支持實時監控任務進度。
  18. Rolling實時日誌:支持在線查看調度結果,並且支持以Rolling方式實時查看執行器輸出的完整的執行日誌。
  19. GLUE:提供Web IDE,支持在線開發任務邏輯代碼,動態發佈,實時編譯生效,省略部署上線的過程。支持30個版本的歷史版本回溯。
  20. 腳本任務:支持以GLUE模式開發和運行腳本任務,包括Shell、Python、NodeJS、PHP、PowerShell等類型腳本。
  21. 命令行任務:原生提供通用命令行任務Handler(Bean任務,”CommandJobHandler”);業務方只需要提供命令行即可。
  22. 任務依賴:支持配置子任務依賴,當父任務執行結束且執行成功後將會主動觸發一次子任務的執行, 多個子任務用逗號分隔。
  23. 一致性:“調度中心”通過DB鎖保證集羣分佈式調度的一致性, 一次任務調度只會觸發一次執行。
  24. 自定義任務參數:支持在線配置調度任務入參,即時生效。
  25. 調度線程池:調度系統多線程觸發調度運行,確保調度精確執行,不被堵塞。
  26. 數據加密:調度中心和執行器之間的通訊進行數據加密,提升調度信息安全性。
  27. 郵件報警:任務失敗時支持郵件報警,支持配置多郵件地址羣發報警郵件
  28. 推送maven中央倉庫: 將會把最新穩定版推送到maven中央倉庫, 方便用戶接入和使用。
  29. 運行報表:支持實時查看運行數據,如任務數量、調度次數、執行器數量等;以及調度報表,如調度日期分佈圖,調度成功分佈圖等。
  30. 全異步:任務調度流程全異步化設計實現,如異步調度、異步運行、異步回調等,有效對密集調度進行流量削峯,理論上支持任意時長任務的運行。
  31. 跨語言:調度中心與執行器提供語言無關的 RESTful API 服務,第三方任意語言可據此對接調度中心或者實現執行器。除此之外,還提供了 “多任務模式”和“httpJobHandler”等其他跨語言方案。
  32. 國際化:調度中心支持國際化設置,提供中文、英文兩種可選語言,默認爲中文。
  33. 容器化:提供官方docker鏡像,並實時更新推送dockerhub,進一步實現產品開箱即用。
  34. 線程池隔離:調度線程池進行隔離拆分,慢任務自動降級進入”Slow”線程池,避免耗盡調度線程,提高系統穩定性。
  35. 用戶管理:支持在線管理系統用戶,存在管理員、普通用戶兩種角色。
  36. 權限控制:執行器維度進行權限控制,管理員擁有全量權限,普通用戶需要分配執行器權限後才允許相關操作。

總體設計

源碼目錄介紹

在這裏插入圖片描述

/data/xxljob/xxl-job-2.2.0/
├── doc
│   ├── db
│   ├── images
│   ├── XXL-JOB官方文檔.md
│   ├── XXL-JOB架構圖.pptx
│   └── XXL-JOB-English-Documentation.md
├── LICENSE
├── NOTICE
├── pom.xml
├── README.md
├── xxl-job-admin //調度中心,項目源碼
│   ├── Dockerfile
│   ├── pom.xml
│   └── src
├── xxl-job-core  //公共Jar依賴
│   ├── pom.xml
│   └── src
└── xxl-job-executor-samples //執行器,Sample示例項目。我們可以在該項目上進行開發,也可以將現有項目改造生成執行器項目
    ├── pom.xml
    ├── xxl-job-executor-sample-frameless //無框架版本
    ├── xxl-job-executor-sample-jboot //Jboot版本,通過Jboot管理執行器
    ├── xxl-job-executor-sample-jfinal //JFinal版本,通過JFinal管理執行器
    ├── xxl-job-executor-sample-nutz //Nutz版本,通過Nutz管理執行器
    ├── xxl-job-executor-sample-spring //Spring版本,通過Spring容器管理執行器,比較通用
    └── xxl-job-executor-sample-springboot //Springboot版本,通過Springboot管理執行器,推薦這種方式

“調度數據庫”配置

XXL-JOB調度模塊基於自研調度組件並支持集羣部署,調度數據庫表說明如下:

  • xxl_job_lock:任務調度鎖表;
  • xxl_job_group:執行器信息表,維護任務執行器信息;
  • xxl_job_info:調度擴展信息表: 用於保存XXL-JOB調度任務的擴展信息,如任務分組、任務名、機器地址、執行器、執行入參和報警郵件等等;
  • xxl_job_log:調度日誌表: 用於保存XXL-JOB任務調度的歷史信息,如調度結果、執行結果、調度入參、調度機器和執行器等等;
  • xxl_job_log_report:調度日誌報表:用戶存儲XXL-JOB任務調度日誌的報表,調度中心報表功能頁面會用到;
  • xxl_job_logglue:任務GLUE日誌:用於保存GLUE更新歷史,用於支持GLUE的版本回溯功能;
  • xxl_job_registry:執行器註冊表,維護在線的執行器和調度中心機器地址信息;
  • xxl_job_user:系統用戶表;

架構設計

設計思想

將調度行爲抽象形成“調度中心”公共平臺,而平臺自身並不承擔業務邏輯,“調度中心”負責發起調度請求。
將任務抽象成分散的JobHandler,交由“執行器”統一管理,“執行器”負責接收調度請求並執行對應的JobHandler中業務邏輯。
因此,“調度”和“任務”兩部分可以相互解耦,提高系統整體穩定性和擴展性。

系統組成

  • 調度模塊(調度中心)
    負責管理調度信息,按照調度配置發出調度請求,自身不承擔業務代碼。調度系統與任務解耦,提高了系統可用性和穩定性,同時調度系統性能不再受限於任務模塊;
    支持可視化、簡單且動態的管理調度信息,包括任務新建,更新,刪除,GLUE開發和任務報警等,所有上述操作都會實時生效,同時支持監控調度結果以及執行日誌,支持執行器Failover。

  • 執行模塊(執行器)
    負責接收調度請求並執行任務邏輯。任務模塊專注於任務的執行等操作,開發和維護更加簡單和高效;
    接收“調度中心”的執行請求、終止請求和日誌請求等。

架構圖

在這裏插入圖片描述

安裝

環境

官網要求預安裝環境

Maven3+
Jdk1.8+
Mysql5.7+

本機環境
在這裏插入圖片描述
在這裏插入圖片描述
我這裏是安裝好了jdk和maven的,如果有需要的可以參考centos8使用war包安裝部署jenkins以及初始化配置這篇文章,這個裏面有詳細的安裝以及配置步驟。
在這裏插入圖片描述
MySQL我安裝的是8.0.21版本的,如果有需要,可以參考centos8安裝MySQL8,裏面有詳細的安裝已經配置步驟。




創建目錄

[root@dxm31 ~]# mkdir -p /data/xxljob
[root@dxm31 ~]# cd /data/xxljob/

下載

[root@dxm31 xxljob]# wget https://github.com/xuxueli/xxl-job/archive/v2.2.0.tar.gz
[root@dxm31 xxljob]# ll -h

在這裏插入圖片描述

解壓

[root@dxm31 xxljob]# tar -zxvf v2.2.0.tar.gz

在這裏插入圖片描述

初始化調度數據庫

“調度數據庫初始化SQL腳本” 位置爲:/xxl-job/doc/db/tables_xxl_job.sql
調度中心支持集羣部署,集羣情況下各節點務必連接同一個mysql實例;
如果mysql做主從,調度中心集羣節點務必強制走主庫;

調度數據庫表說明

xxl_job_info:調度擴展信息表: 用於保存XXL-JOB調度任務的擴展信息,如任務分組、任務名、機器地址、執行器、執行入參和報警郵件等等;
xxl_job_log:調度日誌表: 用於保存XXL-JOB任務調度的歷史信息,如調度結果、執行結果、調度入參、調度機器和執行器等等;
xxl_job_log_report:調度日誌報表:用戶存儲XXL-JOB任務調度日誌的報表,調度中心報表功能頁面會用到;
xxl_job_logglue:任務GLUE日誌:用於保存GLUE更新歷史,用於支持GLUE的版本回溯功能;
xxl_job_registry:執行器註冊表,維護在線的執行器和調度中心機器地址信息;
xxl_job_group:執行器信息表,維護任務執行器信息;
xxl_job_user:系統用戶表;
xxl_job_lock:任務調度鎖表;






我們可以通過mysql -uroot -p123456 < /data/xxljob/xxl-job-2.2.0/doc/db/tables_xxl_job.sql這種操作來初始化數據庫,也可以通過用navicat工具導入再執行sql這種操作來初始化數據庫,大家任意選擇,怎麼方便怎麼來。
在這裏插入圖片描述

配置部署"調度中心"(xxl-job-admin)

調度中心作用:統一管理任務調度平臺上調度任務,負責觸發調度執行,並且提供任務管理平臺。

修改application.properties配置文件

調度中心配置文件地址:/xxl-job/xxl-job-admin/src/main/resources/application.properties

修改此配置文件

[root@dxm31 ~]# vim /data/xxljob/xxl-job-2.2.0/xxl-job-admin/src/main/resources/application.properties

內容如下:

### web
server.port=8082
server.context-path=/xxl-job-admin

### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false

### resources
spring.mvc.servlet.load-on-startup=0
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
#mybatis.type-aliases-package=com.xxl.job.admin.core.model

### xxl-job, datasource 調度中心JDBC鏈接:鏈接地址請保持和 2.1章節 所創建的調度數據庫的地址一致
spring.datasource.url=jdbc:mysql://192.168.0.22:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1

### xxl-job email 報警郵箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=[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

### xxl-job, access token 調度中心通訊TOKEN [選填]:非空時啓用;
xxl.job.accessToken=

### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en") 調度中心國際化配置 [必填]: 默認爲 "zh_CN"/中文簡體, 可選範圍爲 "zh_CN"/中文簡體, "zh_TC"/中文繁體 and "en"/英文;
xxl.job.i18n=zh_CN

## xxl-job, triggerpool max size 調度線程池最大線程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100

### xxl-job, log retention days 調度中心日誌表數據保存天數 [必填]:過期日誌自動清理;限制大於等於7時生效,否則, 如-1,關閉自動清理功能;
xxl.job.logretentiondays=30

其中web 端口默認是8080,如果有衝突,一定要更換(本文采用8082,因爲8080是tomcat服務,8081是maven私服。),另外spring.datasource.url注意一下這裏的IP,如果不是127.0.0.1,也一定要更換。

修改logback.xml(指定xxl-job的日誌路徑)

查看一下默認配置日誌路徑:
在這裏插入圖片描述
默認日誌路徑爲:/data/applogs/xxl-job/xxl-job-admin.log,我們改爲/data/xxl-job/xxl-job-admin.log。
操作步驟:


[root@dxm31 ~]# vim /data/xxljob/xxl-job-2.2.0/xxl-job-admin/src/main/resources/logback.xml

修改以下內容:

<property name="log.path" value="/data/xxl-job/xxl-job-admin.log"/>

在這裏插入圖片描述

配置部署"執行器項目"

“執行器”項目:xxl-job-executor-sample-springboot (提供多種版本執行器供選擇,現以 springboot 版本爲例,可直接使用,也可以參考其並將現有項目改造成執行器)。

作用:負責接收“調度中心”的調度並執行;可直接部署執行器,也可以將執行器集成到現有業務項目中。

修改執行器配置文件

我們以 springboot 版本爲例,要修改的配置文件路徑爲:xxl-job-2.2.0/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

[root@dxm31 ~]# vim /data/xxljob/xxl-job-2.2.0/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

修改內容如下:

# web port
server.port=8083
# no web
#spring.main.web-environment=false

# log config
logging.config=classpath:logback.xml


### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" 調度中心部署跟地址 [選填]:如調度中心集羣部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回調";爲空則關閉自動註冊;
xxl.job.admin.addresses=http://127.0.0.1:8082/xxl-job-admin

### xxl-job, access token 執行器通訊TOKEN [選填]:非空時啓用;
xxl.job.accessToken=

### xxl-job executor appname 執行器AppName [選填]:執行器心跳註冊分組依據;爲空則關閉自動註冊
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null 執行器註冊 [選填]:優先使用該配置作爲註冊地址,爲空時使用內嵌服務 ”IP:PORT“ 作爲註冊地址。從而更靈活的支持容器類型執行器動態IP和動態映射端口問題。
xxl.job.executor.address=
### xxl-job executor server-info 執行器IP [選填]:默認爲空表示自動獲取IP,多網卡時可手動設置指定IP,該IP不會綁定Host僅作爲通訊實用;地址信息用於 "執行器註冊" 和 "調度中心請求並觸發任務";
xxl.job.executor.ip=
### 執行器端口號 [選填]:小於等於0則自動獲取;默認端口爲9999,單機部署多個執行器時,注意要配置不同執行器端口;
xxl.job.executor.port=9999
### xxl-job executor log-path 執行器運行日誌文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權限;爲空則使用默認路徑;
xxl.job.executor.logpath=/data/xxl-job/jobhandler
### xxl-job executor log-retention-days 執行器日誌文件保存天數 [選填] : 過期日誌自動清理, 限制值大於等於3時生效; 否則, 如-1, 關閉自動清理功能;
xxl.job.executor.logretentiondays=30

其中web 端口默認是8081,如果有衝突,一定要更換(本文采用8083)

修改logback.xml(指定xxl-job的日誌路徑)

查看一下默認配置日誌路徑:
在這裏插入圖片描述
默認日誌路徑爲:/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log,我們改爲/data/xxl-job/xxl-job-executor-sample-springboot.log。
操作步驟:


[root@dxm31 ~]# vim /data/xxljob/xxl-job-2.2.0/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/logback.xml

修改以下內容:

<property name="log.path" value="/data/xxl-job/xxl-job-executor-sample-springboot.log"/>

在這裏插入圖片描述

打包部署項目

如果已經正確進行上述配置,可將項目編譯打包部署。

[root@dxm31 ~]# cd /data/xxljob/xxl-job-2.2.0/
[root@dxm31 xxl-job-2.2.0]# mvn clean install

在這裏插入圖片描述
看到這個證明項目編譯打包完成。
查看一下xxl-job-admin/target/下面是否有xxl-job-admin-2.2.0.jar:

[root@dxm31 xxl-job-2.2.0]# ll xxl-job-admin/target/

在這裏插入圖片描述
查看一下xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/下面是否有xxl-job-executor-sample-springboot-2.2.0.jar:

[root@dxm31 xxl-job-2.2.0]# ll xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/

在這裏插入圖片描述

啓動

啓動調度中心

啓動調度中心命令:nohup java -jar xxl-job-admin/target/xxl-job-admin-2.2.0.jar &

[root@dxm31 xxl-job-2.2.0]# nohup java -jar xxl-job-admin/target/xxl-job-admin-2.2.0.jar &

在這裏插入圖片描述
查看進程以及端口監聽情況:

[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-admin
[root@dxm31 xxl-job-2.2.0]# netstat -ntlp | grep 8082

在這裏插入圖片描述
我們用瀏覽器訪問一下http://IP+端口,我們這裏是http://192.168.0.31:8082/xxl-job-admin
在這裏插入圖片描述
默認登錄賬號 “admin/123456”, 登錄後運行界面如下圖所示:在這裏插入圖片描述
至此“調度中心”項目已經部署成功。



啓動執行器

啓動執行器命令:nohup java -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.2.0.jar &

[root@dxm31 xxl-job-2.2.0]# nohup java -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.2.0.jar &

在這裏插入圖片描述
查看進程以及端口監聽情況:

[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-executor-sample-springboot
[root@dxm31 xxl-job-2.2.0]# netstat -ntlp | grep 8083

在這裏插入圖片描述
至此“執行器”項目已經部署結束。

加入systemctl管理並設置開機自啓動

創建啓動調度中心的啓動腳本

#  創建/usr/local/xxl-job目錄,用於存放jar包和啓動腳本
[root@dxm31 ~]# mkdir -p /usr/local/xxl-job

# 將編譯打包後的xxl-job-admin-2.2.0.jar複製到/usr/local/xxl-job目錄下
[root@dxm31 ~]# cp /data/xxljob/xxl-job-2.2.0/xxl-job-admin/target/xxl-job-admin-2.2.0.jar /usr/local/xxl-job/

# 創建啓動腳本並編寫內容
[root@dxm31 ~]# vim /usr/local/xxl-job/startadmin.sh

#!/bin/sh

nohup /usr/local/jdk/bin/java -jar /usr/local/xxl-job/xxl-job-admin-2.2.0.jar >> ./nohup.out 2>&1 &

# 給啓動腳本增加可執行權限
[root@dxm31 ~]# chmod +x /usr/local/xxl-job/startadmin.sh

將調度中心加入systemctl管理

創建xxl-job-admin.service服務文件

創建xxl-job-admin.service服務文件

[root@dxm31 ~]# vim /etc/systemd/system/xxl-job-admin.service

內容如下:

[Unit]
Description=xxl-job-admin server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
User=root
Group=root
ExecStart=sh /usr/local/xxl-job/startadmin.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

重新加載服務列表

[root@dxm31 ~]# systemctl daemon-reload

啓動服務

# 停止上面手動後臺啓動的xxl-job-admin服務
[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-admin
root        4812  0.7 15.1 4542108 582008 pts/0  Sl   12:12   0:28 java -jar xxl-job-admin/target/xxl-job-admin-2.2.0.jar
root        5778  0.0  0.0  12320  1068 pts/0    R+   13:14   0:00 grep --color=auto xxl-job-admin

[root@dxm31 xxl-job-2.2.0]# kill -9 4812

# 檢查是否還存在xxl-job-admin進程
[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-admin
root        5789  0.0  0.0  12320  1084 pts/0    S+   13:15   0:00 grep --color=auto xxl-job-admin

# 查詢所有服務單元是否有xxl-job-admin
[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-admin
xxl-job-admin.service                      disabled

# 存在,且非開啓自啓動,使用systemctl啓動xxl-job-admin服務
[root@dxm31 xxl-job-2.2.0]# systemctl start xxl-job-admin.service

# 查看nginx服務狀態
[root@dxm31 xxl-job-2.2.0]# systemctl status xxl-job-admin.service

在這裏插入圖片描述
Active: active (running) 可以看到xxl-job-admin服務已經啓動成功。查看進程以及端口的監聽情況:

[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-admin

[root@dxm31 xxl-job-2.2.0]# netstat -ntlp | grep 8082

在這裏插入圖片描述
瀏覽器訪問http://192.168.0.31:8082/xxl-job-admin
在這裏插入圖片描述

將調度中心設置爲開機自啓動

[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-admin.service
xxl-job-admin.service                      disabled
# disabled表示非開機自啓動

# 設置爲開機自啓動
[root@dxm31 xxl-job-2.2.0]# systemctl enable xxl-job-admin.service
Created symlink /etc/systemd/system/multi-user.target.wants/xxl-job-admin.service → /etc/systemd/system/xxl-job-admin.service.

# 再次查看
[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-admin.service
xxl-job-admin.service                      enabled

# enabled表示是開機自啓動,執行重啓命令
[root@dxm31 xxl-job-2.2.0]# reboot

#重啓後再次查看xxl-job-admin服務已啓動完成。

創建啓動執行器的啓動腳本


# 將編譯打包後的xxl-job-executor-sample-springboot-2.2.0.jar複製到/usr/local/xxl-job目錄下
[root@dxm31 xxl-job-2.2.0]# cp /data/xxljob/xxl-job-2.2.0/xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.2.0.jar /usr/local/xxl-job/

# 創建啓動腳本並編寫內容
[root@dxm31 xxl-job-2.2.0]# vim /usr/local/xxl-job/startexecutor.sh

#!/bin/sh

nohup /usr/local/jdk/bin/java -jar /usr/local/xxl-job/xxl-job-executor-sample-springboot-2.2.0.jar >> ./nohup.out 2>&1 &

# 給啓動腳本增加可執行權限
[root@dxm31 xxl-job-2.2.0]# chmod +x /usr/local/xxl-job/startexecutor.sh

將執行器加入systemctl管理

創建xxl-job-executor.service服務文件

創建xxl-job-executor.service服務文件

[root@dxm31 xxl-job-2.2.0]# vim /etc/systemd/system/xxl-job-executor.service

內容如下:

[Unit]
Description=xxl-job-executor server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
User=root
Group=root
ExecStart=sh /usr/local/xxl-job/startexecutor.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

重新加載服務列表

[root@dxm31 xxl-job-2.2.0]# systemctl daemon-reload

啓動服務

# 停止上面手動後臺啓動的執行器服務
[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-executor-sample-springboot
root        6953  291  9.0 4518132 349104 pts/0  Sl   14:20   0:08 java -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.2.0.jar
root        6999  0.0  0.0  12320  1088 pts/0    S+   14:20   0:00 grep --color=auto xxl-job-executor-sample-springboot

[root@dxm31 xxl-job-2.2.0]# kill -9 6953

# 檢查是否還存在執行器進程
[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-executor-sample-springboot
root        7016  0.0  0.0  12320  1068 pts/0    S+   14:22   0:00 grep --color=auto xxl-job-executor-sample-springboot

# 查詢所有服務單元是否有執行器
[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-executor.service
xxl-job-executor.service                   disabled

# 存在,且非開啓自啓動,使用systemctl啓動執行器服務
[root@dxm31 xxl-job-2.2.0]# systemctl start xxl-job-executor.service

# 查看nginx服務狀態
[root@dxm31 xxl-job-2.2.0]# systemctl status xxl-job-executor.service

在這裏插入圖片描述
Active: active (running) 可以看到執行器服務已經啓動成功。查看進程以及端口的監聽情況:

[root@dxm31 xxl-job-2.2.0]# ps aux | grep xxl-job-executor-sample-springboot
[root@dxm31 xxl-job-2.2.0]# netstat -ntlp | grep 8083

在這裏插入圖片描述

將執行器設置爲開機自啓動

[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-executor.service
xxl-job-executor.service                   disabled
# disabled表示非開機自啓動

# 設置爲開機自啓動
[root@dxm31 xxl-job-2.2.0]# systemctl enable xxl-job-executor.service
Created symlink /etc/systemd/system/multi-user.target.wants/xxl-job-executor.service → /etc/systemd/system/xxl-job-executor.service.

# 再次查看
[root@dxm31 xxl-job-2.2.0]# systemctl list-unit-files | grep xxl-job-executor.service
xxl-job-executor.service                   enabled

# enabled表示是開機自啓動,執行重啓命令
[root@dxm31 xxl-job-2.2.0]# reboot

#重啓後再次查看執行器服務已啓動完成。

開發第一個任務“Hello World”

任務運行模式主要有Bean模式和Gule模式(理解爲腳本)。下面我們就分別以這兩種不同的運行模式分別開發一個任務。

Gule模式

“GLUE模式(Java)”的執行代碼託管到調度中心在線維護,相比“Bean模式任務”需要在執行器項目開發部署上線,更加簡便輕量。

前提:請確認“調度中心”和“執行器”項目已經成功部署並啓動!!!!

原理: 每個 “GLUE模式(Java)” 任務的代碼,實際上是“一個繼承自“IJobHandler”的實現類的類代碼”,“執行器”接收到“調度中心”的調度請求時,會通過Groovy類加載器加載此代碼,實例化成Java對象,同時注入此代碼中聲明的Spring服務(請確保Glue代碼中的服務和類引用在“執行器”項目中存在),然後調用該對象的execute方法,執行任務邏輯。

下面開始介紹一下詳細的步驟:
第一步:新建任務
登錄調度中心,點擊下圖所示“新建任務”按鈕,新建示例任務。然後,參考下面截圖中任務的參數配置,點擊保存。
在這裏插入圖片描述
在這裏插入圖片描述
從這個圖,大家可以發現,cron表達式的編寫更加方便了。
點擊保存之後,彈出:
在這裏插入圖片描述
點擊確定。在這裏插入圖片描述
這個就是我們上面新建的任務。
在這裏插入圖片描述
從任務管理列表截圖可以看出比之前增加了根據狀態、任務描述以及負責人這三個搜索項。
第二步:“GLUE模式(Java)” 任務開發
在這裏插入圖片描述
我們在我們上面新建任務『測試』這列操作選擇GLUE IDE,進入 “GLUE編輯器開發界面” ,見下圖。“GLUE模式(Java)” 運行模式的任務默認已經初始化了示例任務代碼,即打印Hello World。
在這裏插入圖片描述
我們簡單改變一下這段示例代碼,在log後面加上當前時間,然後點擊保存,輸入源碼備註,保存成功。















版本回溯功能(支持30個版本的版本回溯):在GLUE任務的Web IDE界面,選擇右上角下拉框“版本回溯”,會列出該GLUE的更新歷史,選擇相應版本即可顯示該版本代碼,保存後GLUE代碼即回退到對應的歷史版本;

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		XxlJobLogger.log("XXL-JOB, Hello World."+df.format(System.currentTimeMillis()));

注意:要導入需要的包,否則會執行失敗。

import java.text.SimpleDateFormat;
import java.util.Date;

見下圖:
在這裏插入圖片描述
GLUE模式(Java):任務以源碼方式維護在調度中心;該模式的任務實際上是一段繼承自IJobHandler的Java類代碼並 “groovy” 源碼方式維護,它在執行器項目中運行,可使用@Resource/@Autowire注入執行器裏中的其他服務。
第三步:觸發執行
點擊任務右側操作下面的 “執行一次” 按鈕,可手動觸發一次任務執行(通常情況下,通過配置Cron表達式進行任務調度觸發)。
在這裏插入圖片描述
在這裏插入圖片描述
我們這裏是簡單的任務測試,無需輸入任何參數,只需要點擊『保存』按鈕即可。在這裏插入圖片描述
第四步:查看日誌
點擊任務右側操作下 “查詢日誌” 按鈕,可前往調度日誌界面查看調度日誌。
在調度日誌界面中,可查看該任務的歷史調度記錄以及每一次調度的調度時間、調度結果、調度備註、執行時間、執行結果和執行備註。運行中的任務點擊右側的“執行日誌”按鈕,可進入日誌控制檯查看實時執行日誌。在這裏插入圖片描述
在這裏插入圖片描述
可以看到調度結果和執行結果都是:成功。我們點擊調度備註查看:在這裏插入圖片描述
點擊操作,裏面有執行日誌和終止任務兩個按鈕:
在這裏插入圖片描述
由於我們任務比較簡單,已經執行完成,我們來點擊一下執行日誌按鈕看一下:
在這裏插入圖片描述















2020-12-28 15:39:35 [com.xxl.job.core.thread.JobThread#run]-[124]-[Thread-8] 
----------- xxl-job job execute start -----------
----------- Param:
2020-12-28 15:39:35 [com.xxl.job.core.handler.impl.GlueJobHandler#execute]-[26]-[Thread-9] ----------- glue.version:1609141157000 -----------
2020-12-28 15:39:35 [sun.reflect.NativeMethodAccessorImpl#invoke0]-[-2]-[Thread-9] XXL-JOB, Hello World.2020-12-28 15:39:35
2020-12-28 15:39:35 [com.xxl.job.core.thread.JobThread#run]-[164]-[Thread-8] 
----------- xxl-job job execute end(finish) -----------
----------- ReturnT:ReturnT [code=200, msg=null, content=null]
2020-12-28 15:39:35 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[191]-[xxl-job, executor TriggerCallbackThread] 
----------- xxl-job job callback finish.

[Load Log Finish]

我們可以看到這裏面有job執行開始信息、參數、glue版本號、我們輸入的Hello World.+當前時間、job執行結束信息、ReturnT:ReturnT返回執行結果以及job 回到完成信息。

通過我們上面的簡單的開發任務可以看出GLUE的**原理是:每一個GLUE模式的代碼,在“執行器”接受到調度請求時,都會通過Groovy類加載器加載出代碼,並實例化成Java對象,同時注入此代碼中聲明的Spring服務(這裏要確保代碼中所引用的類或服務在“執行器項目中存在”),接着調用該對象的execute方法,執行具體的任務邏輯。**說白了,就是任務以源碼方式維護在調度中心,支持通過Web IDE在線更新,實時編譯和生效,因此不需要指定JobHandler。

BEAN模式

在該模式下,任務的具體實現邏輯是以JobHandler的形式存在於“執行器項目”中

BEAN模式(類形式)

Bean模式(類形式)任務支持基於類的開發方式,每個任務對應一個Java類。

  • 優點:不限制項目環境,兼容性好。即使是無框架項目,如main方法直接啓動的項目也可以提供支持,可以參考示例項目 “xxl-job-executor-sample-frameless”;
  • 缺點:每個任務需要佔用一個Java類,造成類的浪費;
    不支持自動掃描任務並注入到執行器容器,需要手動注入。

原理: 每個Bean模式任務都是一個Spring的Bean類實例,它被維護在“執行器”項目的Spring容器中。任務類需要加“@JobHandler(value=”名稱”)”註解,因爲“執行器”會根據該註解識別Spring容器中的任務。任務類需要繼承統一接口“IJobHandler”任務邏輯在execute方法中開發,因爲“執行器”在接收到調度中心的調度請求時,將會調用“IJobHandler”的execute方法,執行任務邏輯。

第一步:執行器項目中,開發Job類

  • 開發一個繼承自"com.xxl.job.core.handler.IJobHandler"的JobHandler類,實現其中任務方法。

  • 手動通過如下方式注入到執行器容器。
    XxlJobExecutor.registJobHandler(“demoJobHandler”, new DemoJobHandler());

第二步:調度中心,新建調度任務

運行模式選中 “BEAN模式”,JobHandler屬性填寫任務註解“@JobHandler”中定義的值;
在這裏插入圖片描述
點擊保存:在這裏插入圖片描述
在這裏插入圖片描述
接下來就可以對任務進行執行一次、查看日誌、啓動等操作。



BEAN模式(方法形式)

Bean模式(方法形式)任務支持基於方法的開發方式,每個任務對應一個方法。

  • 優點:每個任務只需要開發一個方法,並添加”@XxlJob”註解即可,更加方便、快速。
    支持自動掃描任務並注入到執行器容器。
  • 缺點:要求Spring容器環境;

基於方法開發的任務,底層會生成JobHandler代理,和基於類的方式一樣,任務也會以JobHandler的形式存在於執行器任務容器中。

第一步:執行器項目中,開發Job方法

1、任務開發:在Spring Bean實例中,開發Job方法;
2、註解配置:爲Job方法添加註解 "@XxlJob(value="自定義jobhandler名稱", init = "JobHandler初始化方法", destroy = "JobHandler銷燬方法")",註解value值對應的是調度中心新建任務的JobHandler屬性的值。
3、執行日誌:需要通過 "XxlJobHelper.log" 打印執行日誌;
4、任務結果:默認任務結果爲 "成功" 狀態,不需要主動設置;如有訴求,比如設置任務結果爲失敗,可以通過 "XxlJobHelper.handleFail/handleSuccess" 自主設置任務結果;

// 可參考Sample示例執行器中的 “com.xxl.job.executor.service.jobhandler.SampleXxlJob” ,如下:
@XxlJob(“demoJobHandler”)
public void demoJobHandler() throws Exception {
XxlJobHelper.log(“XXL-JOB, Hello World.”);
}



第二步:調度中心,新建調度任務

運行模式選中 “BEAN模式”,JobHandler屬性填寫任務註解“@XxlJob”中定義的值。可以參考下面“配置屬性詳細說明”對新建的任務進行參數配置。

配置屬性詳細說明

基礎配置:

  • 執行器:任務的綁定的執行器,任務觸發調度時將會自動發現註冊成功的執行器, 實現任務自動發現功能; 另一方面也可以方便的進行任務分組。每個任務必須綁定一個執行器, 可在 “執行器管理” 進行設置;
  • 任務描述:任務的描述信息,便於任務管理;
  • 負責人:任務的負責人;
  • 報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;

觸發配置:

  • 調度類型
    無:該類型不會主動觸發調度;
    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隊列並以串行方式運行;
    丟棄後續調度:調度請求進入單機執行器後,發現執行器存在運行的調度任務,本次請求將會被丟棄並標記爲失敗;
    覆蓋之前調度:調度請求進入單機執行器後,發現執行器存在運行的調度任務,將會終止運行中的調度任務並清空隊列,然後運行本地調度任務;


  • 任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
  • 失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章