分布式任務調度框架xxljob2.2.0詳細安裝使用教程
- 簡介
- 概述
- 特性
- 總體設計
- 原始碼目錄介紹
- “調度資料庫”配置
- 架構設計
- 設計思想
- 系統組成
- 架構圖
- 安裝
- 環境
- 創建目錄
- 下載
- 解壓
- 初始化調度資料庫
- 調度資料庫表說明
- 配置部署"調度中心"(xxl-job-admin)
- 修改application.properties組態檔
- 修改logback.xml(指定xxl-job的日志路徑)
- 配置部署"執行器專案"
- 修改執行器組態檔
- 修改logback.xml(指定xxl-job的日志路徑)
- 打包部署專案
- 啟動
- 啟動調度中心
- 啟動執行器
- 加入systemctl管理并設定開機自啟動
- 創建啟動調度中心的啟動腳本
- 將調度中心加入systemctl管理
- 創建xxl-job-admin.service服務檔案
- 重新加載服務串列
- 啟動服務
- 將調度中心設定為開機自啟動
- 創建啟動執行器的啟動腳本
- 將執行器加入systemctl管理
- 創建xxl-job-executor.service服務檔案
- 重新加載服務串列
- 啟動服務
- 將執行器設定為開機自啟動
- 開發第一個任務“Hello World”
- Gule模式
- BEAN模式
- BEAN模式(類形式)
- 第一步:執行器專案中,開發Job類
- 第二步:調度中心,新建調度任務
- BEAN模式(方法形式)
- 第一步:執行器專案中,開發Job方法
- 第二步:調度中心,新建調度任務
- 配置屬性詳細說明
簡介
概述
XXL-JOB是一個分布式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展,現已開放源代碼并接入多家公司線上產品線,開箱即用,
特性
- 簡單:支持通過Web頁面對任務進行CRUD操作,操作簡單,一分鐘上手,
- 動態:支持動態修改任務狀態、啟動/停止任務,以及終止運行中任務,即時生效,
- 調度中心HA(中心式):調度采用中心式設計,“調度中心”自研調度組件并支持集群部署,可保證調度中心HA,
- 執行器HA(分布式):任務分布式執行,任務”執行器”支持集群部署,可保證任務執行HA,
- 注冊中心: 執行器會周期性自動注冊任務, 調度中心將會自動發現注冊的任務并觸發執行,同時,也支持手動錄入執行器地址,
- 彈性擴容縮容:一旦有新執行器機器上線或者下線,下次調度時將會重新分配任務,
- 觸發策略:提供豐富的任務觸發策略,包括:Cron觸發、固定間隔觸發、固定延時觸發、API(事件)觸發、人工觸發、父子任務觸發,
- 調度過期策略:調度中心錯過調度時間的補償處理策略,包括:忽略、立即補償觸發一次等,
- 阻塞處理策略:調度過于密集,執行器來不及處理時的處理策略,策略包括:單機串行(默認)、丟棄后續調度、覆寫之前調度,
- 任務超時控制:支持自定義任務超時時間,任務運行超時將會主動中斷任務,
- 任務失敗重試:支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;其中分片任務支持分片粒度的失敗重試 ,
- 任務失敗告警;默認提供郵件方式失敗告警,同時預留擴展介面,可方便的擴展短信、釘釘等告警方式,
- 路由策略:執行器集群部署時提供豐富的路由策略,包括:第一個、最后一個、輪詢、隨機、一致性HASH、最不經常使用、最近最久未使用、故障轉移、忙碌轉移等,
- 分片廣播任務:執行器集群部署時,任務路由策略選擇”分片廣播”情況下,一次任務調度將會廣播觸發集群中所有執行器執行一次任務,可根據分片引數開發分片任務,
- 動態分片:分片廣播任務以執行器為維度進行分片,支持動態擴容執行器集群從而動態增加分片數量,協同進行業務處理;在進行大資料量業務操作時可顯著提升任務處理能力和速度,
- 故障轉移:任務路由策略選擇”故障轉移”情況下,如果執行器集群中某一臺機器故障,將會自動Failover切換到一臺正常的執行器發送調度請求,
- 任務進度監控:支持實時監控任務進度,
- Rolling實時日志:支持在線查看調度結果,并且支持以Rolling方式實時查看執行器輸出的完整的執行日志,
- GLUE:提供Web IDE,支持在線開發任務邏輯代碼,動態發布,實時編譯生效,省略部署上線的程序,支持30個版本的歷史版本回溯,
- 腳本任務:支持以GLUE模式開發和運行腳本任務,包括Shell、Python、NodeJS、PHP、PowerShell等型別腳本,
- 命令列任務:原生提供通用命令列任務Handler(Bean任務,”CommandJobHandler”);業務方只需要提供命令列即可,
- 任務依賴:支持配置子任務依賴,當父任務執行結束且執行成功后將會主動觸發一次子任務的執行, 多個子任務用逗號分隔,
- 一致性:“調度中心”通過DB鎖保證集群分布式調度的一致性, 一次任務調度只會觸發一次執行,
- 自定義任務引數:支持在線配置調度任務入參,即時生效,
- 調度執行緒池:調度系統多執行緒觸發調度運行,確保調度精確執行,不被堵塞,
- 資料加密:調度中心和執行器之間的通訊進行資料加密,提升調度資訊安全性,
- 郵件報警:任務失敗時支持郵件報警,支持配置多郵件地址群發報警郵件,
- 推送maven中央倉庫: 將會把最新穩定版推送到maven中央倉庫, 方便用戶接入和使用,
- 運行報表:支持實時查看運行資料,如任務數量、調度次數、執行器數量等;以及調度報表,如調度日期分布圖,調度成功分布圖等,
- 全異步:任務調度流程全異步化設計實作,如異步調度、異步運行、異步回呼等,有效對密集調度進行流量削峰,理論上支持任意時長任務的運行,
- 跨語言:調度中心與執行器提供語言無關的 RESTful API 服務,第三方任意語言可據此對接調度中心或者實作執行器,除此之外,還提供了 “多任務模式”和“httpJobHandler”等其他跨語言方案,
- 國際化:調度中心支持國際化設定,提供中文、英文兩種可選語言,默認為中文,
- 容器化:提供官方docker鏡像,并實時更新推送dockerhub,進一步實作產品開箱即用,
- 執行緒池隔離:調度執行緒池進行隔離拆分,慢任務自動降級進入”Slow”執行緒池,避免耗盡調度執行緒,提高系統穩定性,
- 用戶管理:支持在線管理系統用戶,存在管理員、普通用戶兩種角色,
- 權限控制:執行器維度進行權限控制,管理員擁有全量權限,普通用戶需要分配執行器權限后才允許相關操作,
總體設計
原始碼目錄介紹

/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=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
### 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佇列并以串行方式運行;
丟棄后續調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,本次請求將會被丟棄并標記為失敗;
覆寫之前調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,將會終止運行中的調度任務并清空佇列,然后運行本地調度任務; - 任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
- 失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/242863.html
標籤:其他
上一篇:Spring Cloud 2020.0.0 正式發布,對開發者來說意味著什么?
下一篇:HaaS100低功耗藍牙體驗
