分佈式任務平臺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   #項目端口號
 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() 代碼才能將日誌打印到上面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章