分散式任務排程平臺XXL-JOB搭建教程
關於分散式任務排程平臺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 [email protected] 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#專案埠號 3port: 8081 4 logging: 5#日誌檔案 6config: classpath:logback.xml 7 8 xxl: 9job: 10admin: 11#排程中心部署跟地址:如排程中心叢集部署存在多個地址則用逗號分隔。 12#執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回撥"。 13addresses: http://127.0.0.1:8080/xxl-job-admin 14 15#分別配置執行器的名稱、ip地址、埠號 16#注意:如果配置多個執行器時,防止埠衝突 17executor: 18appname: executorDemo 19ip: 127.0.0.1 20port: 9999 21 22#執行器執行日誌檔案儲存的磁碟位置,需要對該路徑擁有讀寫許可權 23logpath: /data/applogs/xxl-job/jobhandler 24#執行器Log檔案定期清理功能,指定日誌儲存天數,日誌檔案過期自動刪除。限制至少保持3天,否則功能不生效; 25#-1表示永不刪除 26logretentiondays: -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 { 15private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); 16 17@Value("${xxl.job.admin.addresses}") 18private String adminAddresses; 19 20@Value("${xxl.job.executor.appname}") 21private String appName; 22 23@Value("${xxl.job.executor.ip}") 24private String ip; 25 26@Value("${xxl.job.executor.port}") 27private int port; 28 29@Value("${xxl.job.accessToken}") 30private String accessToken; 31 32@Value("${xxl.job.executor.logpath}") 33private String logPath; 34 35@Value("${xxl.job.executor.logretentiondays}") 36private int logRetentionDays; 37 38 39@Bean(initMethod = "start", destroyMethod = "destroy") 40public XxlJobSpringExecutor xxlJobExecutor() { 41logger.info(">>>>>>>>>>> xxl-job config init."); 42XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); 43xxlJobSpringExecutor.setAdminAddresses(adminAddresses); 44xxlJobSpringExecutor.setAppName(appName); 45xxlJobSpringExecutor.setIp(ip); 46xxlJobSpringExecutor.setPort(port); 47xxlJobSpringExecutor.setAccessToken(accessToken); 48xxlJobSpringExecutor.setLogPath(logPath); 49xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); 50 51return xxlJobSpringExecutor; 52} 53 54 } View Code
④、建立任務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 22public ReturnT<String> execute(String s) throws Exception { 23XxlJobLogger.log("XXL-JOB, Hello World."); 24return SUCCESS; 25} 26 } View Code
注意:這裡有個註解 @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/# 這是中文教程。