接上文......
(7) XXL-JOB環境搭建
(7.1) 源碼結構
通過上面給出的源碼下載地址,我們將源碼clone到IDEA中,如下:

(7.2) 初始化數據庫
初始化腳本在上面源碼目錄的 /doc/db/tables_xxl_job.sql ,將此腳本在MySQL數據庫中執行一遍。
執行完畢,會在MySQL數據庫中生成如下 8 張表:

(7.3) 配置調度中心
調度中心就是源碼中的 xxl-job-admin 工程,我們需要將其配置成自己需要的調度中心,通過該工程我們能夠以圖形化的方式統一管理任務調度平台上調度任務,負責觸發調度執行。
(7.3.1) 修改調度中心配置文件
### web
server.port=8080
server.servlet.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
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.cj.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
spring.datasource.hikari.validation-timeout=1000
### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=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
xxl.job.accessToken=
### xxl-job, i18n (default is zh_CN, and you can choose "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
xxl.job.logretentiondays=30
注意:基本上上面的配置文件我們需要修改的只有第 5 點,修改數據庫的地址,這要與我們前面初始化的數據庫名稱徑,用戶名密碼保持一致;第二個就是修改第 6 點,報警郵箱,因為該工程任務失敗后有失敗告警功能,可以通過郵件來提醒,如果我們需要此功能,可以配置一下。
(7.3.2) 部署調度中心

(7.3.3)訪問調度中心管理界面
地址:
(7.4) 創建執行器項目
下面我以創建一個 springboot 版本的執行器為例來介紹:
在源碼中作者已經貼心的給出了多種執行器項目示例,可根據你的喜好直接將其部署作為你自己的執行器
現以集成到現有項目為例,將執行器集成到現有的一個Spring-Boot項目Athena中去
步驟一:在你的項目里引入xxl-job-core的依賴
<!-- xxl-rpc-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
步驟二:執行器配置
在創建好的springboot 項目的配置文件 application.yml添加如下配置:
#項目端口號
server.port=8081
#日志文件
logging.config= classpath:logback.xml
#調度中心部署跟地址:如調度中心集群部署存在多個地址則用逗號分隔。
#執行器將會使用該地址進行"執行器心跳注冊"和"任務結果回調"。
xxl.job.admin.addresses =http://127.0.0.1:8080/xxl-job-admin
### 執行器通訊TOKEN [選填]:非空時啟用;
xxl.job.accessToken =
#分別配置執行器的名稱、ip地址、端口號
#注意:如果配置多個執行器時,防止端口沖突
xxl.job.executor.appname =executorDemo
xxl.job.executor.address =
xxl.job.executor.ip = 127.0.0.1
xxl.job.executor.port = 9999
#執行器運行日志文件存儲的磁盤位置,需要對該路徑擁有讀寫權限
xxl.job.executor.logpath= D:/data/xxl-job/jobhandler
#執行器Log文件定期清理功能,指定日志保存天數,日志文件過期自動刪除。限制至少保持3天,否則功能不生效;
#-1表示永不刪除
xxl.job.executor.logretentiondays= -1
這里需要注意的是:配置執行器的名稱、IP地址、端口號,后面如果配置多個執行器時,要防止端口沖突。再就是執行器的名稱,我們后面會到上一步的調度中心管理界面進行對應配置。
步驟三:載入配置文件
在項目中創建 XxlJobConfig.class 文件:
package com.example.studyprojects.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
XXL-JOB執行器的相關配置項:
xxl.job.admin.addresses
調度中心的部署地址。若調度中心采用集群部署,存在多個地址,則用逗號分隔。執行器將會使用該地址進行”執行器心跳注冊”和”任務結果回調”。
xxl.job.executor.appname
執行器的應用名稱,它是執行器心跳注冊的分組依據。
xxl.job.executor.ip
執行器的IP地址,用於”調度中心請求並觸發任務”和”執行器注冊”。執行器IP默認為空,表示自動獲取IP。多網卡時可手動設置指定IP,手動設置IP時將會綁定Host。
xxl.job.executor.port
執行器的端口號,默認值為9999。單機部署多個執行器時,注意要配置不同的執行器端口。
xxl.job.accessToken
執行器的通信令牌,非空時啟用。
xxl.job.executor.logpath
執行器輸出的日志文件的存儲路徑,需要擁有該路徑的讀寫權限。
- xxl.job.executor.logretentiondays
執行器日志文件的定期清理功能,指定日志保存天數,日志文件過期自動刪除。限制至少保存3天,否則功能不生效。
步驟四:創建任務
在項目中創建一個Handler,用於執行我們想要執行的東西,這里我只是簡單的打印一行日志:
> XXL-JOB, Hello World!!!
/*
任務示例
*/
@Component
public class JobHandlerDemo {
@XxlJob(value = "demoJobHandler")
public ReturnT<String> execute(String s) throws Exception {
System.out.println("=====hello world=====");
// XxlJobLogger.log("XXL-JOB, Hello World.");
return ReturnT.SUCCESS;
}
}
(8) 調度中心中配置執行器,添加任務
調度中心前面我們已經配置好了,啟動該配置中心,進入http://localhost:8080/xxl-job-admin 界面。
(8.1) 配置執行器
點擊 執行器管理----》新增執行器---》,如下如下界面,然后填充此表格,點擊保存即可。

相關參數說明:
- AppName:是每個執行器集群的唯一標識
AppName, 執行器會周期性以AppName為對象進行自動注冊。可通過該配置自動發現注冊成功的執行器, 供任務調度時使用; - 名稱:執行器的名稱, 因為AppName限制字母數字等組成,可讀性不強, 名稱為了提高執行器的可讀性;
- 注冊方式:調度中心獲取執行器地址的方式,
- 自動注冊:執行器自動進行執行器注冊,調度中心通過底層注冊表可以動態發現執行器機器地址;
- 手動錄入:人工手動錄入執行器的地址信息,多地址逗號分隔,供調度中心使用;
- 機器地址:"注冊方式"為"手動錄入"時有效,支持人工維護執行器的地址信息;
(8.2) 添加新任務
點擊 任務管理---》新增任務---》

相關參數說明:
-
執行器:任務的綁定的執行器,任務觸發調度時將會自動發現注冊成功的執行器, 實現任務自動發現功能; 另一方面也可以方便的進行任務分組。每個任務必須綁定一個執行器, 可在 "執行器管理" 進行設置。
-
任務描述:任務的描述信息,便於任務管理;
-
路由策略:當執行器集群部署時,提供豐富的路由策略,包括;
FIRST(第一個):固定選擇第一個機器;
LAST(最后一個):固定選擇最后一個機器;
ROUND(輪詢):
RANDOM(隨機):隨機選擇在線的機器;
CONSISTENT_HASH(一致性HASH):每個任務按照Hash算法固定選擇某一台機器,且所有任務均勻散列在不同機器上。
LEAST_FREQUENTLY_USED(最不經常使用):使用頻率最低的機器優先被選舉;
LEAST_RECENTLY_USED(最近最久未使用):最久為使用的機器優先被選舉;
FAILOVER(故障轉移):按照順序依次進行心跳檢測,第一個心跳檢測成功的機器選定為目標執行器並發起調度;
BUSYOVER(忙碌轉移):按照順序依次進行空閑檢測,第一個空閑檢測成功的機器選定為目標執行器並發起調度;
SHARDING_BROADCAST(分片廣播):廣播觸發對應集群中所有機器執行一次任務,同時系統自動傳遞分片參數;可根據分片參數開發分片任務; -
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值;
-
阻塞處理策略:調度過於密集執行器來不及處理時的處理策略;
單機串行(默認):調度請求進入單機執行器后,調度請求進入FIFO隊列並以串行方式運行;
丟棄后續調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,本次請求將會被丟棄並標記為失敗;
覆蓋之前調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,將會終止運行中的調度任務並清空隊列,然后運行本地調度任務; -
子任務:每個任務都擁有一個唯一的任務ID(任務ID可以從任務列表獲取),當本任務執行結束並且執行成功時,將會觸發子任務ID所對應的任務的一次主動調度。
-
任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
-
失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
-
報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;
-
負責人:任務的負責人;
-
執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;
(9) 啟動項目 測試任務
配置完執行器以及任務,我們只需要啟動該任務,便可以運行了。

啟動之后,我們查看后台日志:

定時任務觸發成功!!
調度中心查詢日志:

調度成功!!
執行成功!!
輕量級分布式任務調度平台XXL-JOB系列
輕量級分布式任務調度平台(一、 XXL-JOB介紹、原理、工作流程)
輕量級分布式任務調度平台(二、XXL-JOB環境搭建集成springboot)

