關於分布式任務調度平台XXL-JOB,其實作者 許雪里 在其發布的中文教程中已經介紹的很清楚了,這里我就不做過多的介紹了,關於其搭建教程,本人依照其文檔搭建起來基本上也沒遇到啥問題,這里通過博客的形式記錄下來。
1、源碼下載地址
①、GitHub:https://github.com/xuxueli/xxl-job
②、碼雲:https://gitee.com/xuxueli0323/xxl-job
2、文檔地址
①、中文文檔:http://www.xuxueli.com/xxl-job/#/
②、英文文檔:http://www.xuxueli.com/xxl-job/en/#/
3、源碼結構
通過上面給出的源碼下載地址,我們將源碼clone到IDEA中,如下:
4、初始化數據庫
初始化腳本在上面源碼目錄的 /doc/db/tables_xxl_job.sql ,將此腳本在MySQL數據庫中執行一遍。
執行完畢,會在MySQL數據庫中生成如下 16 張表:
5、配置調度中心
調度中心就是源碼中的 xxl-job-admin 工程,我們需要將其配置成自己需要的調度中心,通過該工程我們能夠以圖形化的方式統一管理任務調度平台上調度任務,負責觸發調度執行。
①、修改調度中心配置文件
文件地址:/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
配置文件說明:
1 ### 1、調度中心項目的端口號以及訪問路徑 2 server.port=8080 3 server.context-path=/xxl-job-admin 4 5 ### 2、配置靜態文件的前綴 6 spring.mvc.static-path-pattern=/static/** 7 spring.resources.static-locations=classpath:/static/ 8 9 ### 3、配置模板文件 10 spring.freemarker.templateLoaderPath=classpath:/templates/ 11 spring.freemarker.suffix=.ftl 12 spring.freemarker.charset=UTF-8 13 spring.freemarker.request-context-attribute=request 14 spring.freemarker.settings.number_format=0.########## 15 16 ### 4、配置mybatis的mapper文件地址 17 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml 18 19 ### 5、配置數據庫的地址 20 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8 21 spring.datasource.username=root 22 spring.datasource.password=root_pwd 23 spring.datasource.driver-class-name=com.mysql.jdbc.Driver 24 25 spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource 26 spring.datasource.tomcat.max-wait=10000 27 spring.datasource.tomcat.max-active=30 28 spring.datasource.tomcat.test-on-borrow=true 29 spring.datasource.tomcat.validation-query=SELECT 1 30 spring.datasource.tomcat.validation-interval=30000 31 32 ### 6、配置報警郵箱 33 spring.mail.host=smtp.qq.com 34 spring.mail.port=25 35 spring.mail.username=xxx@qq.com 36 spring.mail.password=xxx 37 spring.mail.properties.mail.smtp.auth=true 38 spring.mail.properties.mail.smtp.starttls.enable=true 39 spring.mail.properties.mail.smtp.starttls.required=true 40 41 42 ### 7、管理界面的登錄用戶名密碼 43 xxl.job.login.username=admin 44 xxl.job.login.password=123456 45 46 ### 8、調度中心通訊TOKEN,非空時啟用 47 xxl.job.accessToken= 48 49 ### 9、調度中心國際化設置,默認為中文版本,值設置為“en”時切換為英文版本 50 xxl.job.i18n=
注意:基本上上面的配置文件我們需要修改的只有第 5 點,修改數據庫的地址,這要與我們前面初始化的數據庫名稱徑,用戶名密碼保持一致;
第二個就是修改第 6 點,報警郵箱,因為該工程任務失敗后有失敗告警功能,可以通過郵件來提醒,如果我們需要此功能,可以配置一下。
②、部署調度中心
該工程是一個springboot項目,我們只需要在IDEA中執行 XxlJobAdminApplication 類即可運行該工程:
③、訪問調度中心管理界面
在瀏覽器輸入 http://localhost:8080/xxl-job-admin 然后輸入用戶名和密碼(前面配置文件中配置的),即可看到如下管理界面。
6、創建執行器項目
其實在源碼中,作者提供了各個版本的 執行器項目,下面我以創建一個 springboot 版本的執行器為例來介紹。
這個執行器的地址為:https://github.com/YSOcean/xxljobexecutordemo.git
①、添加maven依賴
在創建好的springboot 項目的pom.xml 文件中添加如下依賴:
1 <!-- xxl-rpc-core --> 2 <dependency> 3 <groupId>com.xuxueli</groupId> 4 <artifactId>xxl-job-core</artifactId> 5 <version>2.0.1</version> 6 </dependency>
②、配置執行器
在創建好的springboot 項目的配置文件 application.yml 添加如下配置:
1 server: 2 #項目端口號 3 port: 8081 4 logging: 5 #日志文件 6 config: classpath:logback.xml 7 8 xxl: 9 job: 10 admin: 11 #調度中心部署跟地址:如調度中心集群部署存在多個地址則用逗號分隔。 12 #執行器將會使用該地址進行"執行器心跳注冊"和"任務結果回調"。 13 addresses: http://127.0.0.1:8080/xxl-job-admin 14 15 #分別配置執行器的名稱、ip地址、端口號 16 #注意:如果配置多個執行器時,防止端口沖突 17 executor: 18 appname: executorDemo 19 ip: 127.0.0.1 20 port: 9999 21 22 #執行器運行日志文件存儲的磁盤位置,需要對該路徑擁有讀寫權限 23 logpath: /data/applogs/xxl-job/jobhandler 24 #執行器Log文件定期清理功能,指定日志保存天數,日志文件過期自動刪除。限制至少保持3天,否則功能不生效; 25 #-1表示永不刪除 26 logretentiondays: -1
這里需要注意的是:配置執行器的名稱、IP地址、端口號,后面如果配置多個執行器時,要防止端口沖突。再就是執行器的名稱,我們后面會到上一步的調度中心管理界面進行對應配置。
③、載入配置文件
在項目中創建 XxlJobConfig.class 文件:

1 package com.ys.xxljobexecutordemo.config; 2 3 import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; 4 import org.slf4j.Logger; 5 import org.slf4j.LoggerFactory; 6 import org.springframework.beans.factory.annotation.Value; 7 import org.springframework.context.annotation.Bean; 8 import org.springframework.context.annotation.Configuration; 9 10 /** 11 * Create by YSOcean 12 */ 13 @Configuration 14 public class XxlJobConfig { 15 private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); 16 17 @Value("${xxl.job.admin.addresses}") 18 private String adminAddresses; 19 20 @Value("${xxl.job.executor.appname}") 21 private String appName; 22 23 @Value("${xxl.job.executor.ip}") 24 private String ip; 25 26 @Value("${xxl.job.executor.port}") 27 private int port; 28 29 @Value("${xxl.job.accessToken}") 30 private String accessToken; 31 32 @Value("${xxl.job.executor.logpath}") 33 private String logPath; 34 35 @Value("${xxl.job.executor.logretentiondays}") 36 private int logRetentionDays; 37 38 39 @Bean(initMethod = "start", destroyMethod = "destroy") 40 public XxlJobSpringExecutor xxlJobExecutor() { 41 logger.info(">>>>>>>>>>> xxl-job config init."); 42 XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); 43 xxlJobSpringExecutor.setAdminAddresses(adminAddresses); 44 xxlJobSpringExecutor.setAppName(appName); 45 xxlJobSpringExecutor.setIp(ip); 46 xxlJobSpringExecutor.setPort(port); 47 xxlJobSpringExecutor.setAccessToken(accessToken); 48 xxlJobSpringExecutor.setLogPath(logPath); 49 xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); 50 51 return xxlJobSpringExecutor; 52 } 53 54 }
④、創建任務JobHandler
在項目中創建一個Handler,用於執行我們想要執行的東西,這里我只是簡單的打印一行日志:
XXL-JOB, Hello World!!!

1 package com.ys.xxljobexecutordemo.jobhandler; 2 3 import com.xxl.job.core.biz.model.ReturnT; 4 import com.xxl.job.core.handler.IJobHandler; 5 import com.xxl.job.core.handler.annotation.JobHandler; 6 import com.xxl.job.core.log.XxlJobLogger; 7 import org.springframework.stereotype.Component; 8 9 /** 10 * 任務Handler示例(Bean模式) 11 * 12 * 開發步驟: 13 * 1、繼承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”; 14 * 2、注冊到Spring容器:添加“@Component”注解,被Spring容器掃描為Bean實例; 15 * 3、注冊到執行器工廠:添加“@JobHandler(value="自定義jobhandler名稱")”注解,注解value值對應的是調度中心新建任務的JobHandler屬性的值。 16 * 4、執行日志:需要通過 "XxlJobLogger.log" 打印執行日志; 17 */ 18 @JobHandler(value="demoJobHandler") 19 @Component 20 public class JobHandlerDemo extends IJobHandler{ 21 @Override 22 public ReturnT<String> execute(String s) throws Exception { 23 XxlJobLogger.log("XXL-JOB, Hello World."); 24 return SUCCESS; 25 } 26 }
注意:這里有個注解 @JobHandler(value="demoJobHandler"),對於 value的值,我們會在下面進行相應配置。
7、在調度中心中配置執行器
調度中心前面我們已經配置好了,啟動該配置中心,進入http://localhost:8080/xxl-job-admin 界面。
①、配置執行器
點擊 執行器管理----》新增執行器---》,如下如下界面,然后填充此表格,點擊保存即可。
下面是對這幾個參數的介紹:
AppName:是每個執行器集群的唯一標示AppName, 執行器會周期性以AppName為對象進行自動注冊。可通過該配置自動發現注冊成功的執行器, 供任務調度時使用;
名稱:執行器的名稱, 因為AppName限制字母數字等組成,可讀性不強, 名稱為了提高執行器的可讀性;
排序: 執行器的排序, 系統中需要執行器的地方,如任務新增, 將會按照該排序讀取可用的執行器列表;
注冊方式:調度中心獲取執行器地址的方式,
自動注冊:執行器自動進行執行器注冊,調度中心通過底層注冊表可以動態發現執行器機器地址;
手動錄入:人工手動錄入執行器的地址信息,多地址逗號分隔,供調度中心使用;
機器地址:"注冊方式"為"手動錄入"時有效,支持人工維護執行器的地址信息;
②、創建任務
點擊 任務管理---》新增任務---》
執行器:任務的綁定的執行器,任務觸發調度時將會自動發現注冊成功的執行器, 實現任務自動發現功能; 另一方面也可以方便的進行任務分組。每個任務必須綁定一個執行器, 可在 "執行器管理" 進行設置。
任務描述:任務的描述信息,便於任務管理;
路由策略:當執行器集群部署時,提供豐富的路由策略,包括;
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所對應的任務的一次主動調度。
任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;
負責人:任務的負責人;
執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;
8、啟動任務
配置完執行器以及任務,我們只需要啟動該任務,便可以運行了。
啟動之后,我們查看日志:
我們上面配置任務時的cron表達式是每秒鍾執行一次(0/1 * * * * ? *):
打印日志如下:
注意:在項目中,只有通過 XxlJobLogger.log() 代碼才能將日志打印到上面。
參考文檔:https://www.cnblogs.com/xuxueli/p/5021979.html 這是xxl-job作者的博客地址。
http://www.xuxueli.com/xxl-job/# 這是中文教程。