spring boot項目整合xxl-job

閱讀文本大概需要3分鐘。

關於分佈式任務調度平臺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/#/

3.源碼結構

xxl-job-admin:調度中心

xxl-job-core:公共依賴

xxl-job-executor:執行器Sample示例(選擇合適的版本執行器,可直接使用,也可以參考其並將現有項目改造成執行器)
xxl-job-executor-sample-spring:Spring版本,通過Spring容器管理執行器,比較通用,推薦這種方式;
xxl-job-executor-sample-springboot:Springboot版本,通過Springboot管理執行器;
xxl-job-executor-sample-jfinal:JFinal版本,通過JFinal管理執行器;
xxl-job-executor-sample-nutz:Nutz版本,通過Nutz管理執行器;

 4.初始化數據庫腳本

 /doc/db/tables_xxl_job.sql ,將此腳本在MySQL數據庫中執行。

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:系統用戶表;

5.配置調度中心xxl-job-admin

我們需要將其配置成自己需要的調度中心,通過該工程能夠以圖形化的方式統一管理任務調度平臺上調度任務,負責觸發調度執行。

  • 5.1 修改調度中心配置文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties

### 1、調度中心項目的端口號以及訪問路徑
### web
server.port=8080
server.context-path=/xxl-job-admin

### 2、配置靜態文件的前綴
### resources
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

### 3、配置模板文件
### 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.##########

### 4、配置mybatis的mapper文件地址
### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml

### 5、配置數據庫的地址
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=30
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=30000

### 6、配置報警郵箱
### xxl-job email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=172572575 @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

### 7、管理界面的登錄用戶名密碼
xxl.job.login.username=admin
xxl.job.login.password=123456

### 8、調度中心通訊TOKEN,非空時啓用
### xxl-job, access token
xxl.job.accessToken=

### 9、調度中心國際化設置,默認爲中文版本,值設置爲“en”時切換爲英文版本
### xxl-job, i18n (default empty as chinese, "en" as english)
xxl.job.i18n=

配置中基本只需要修改:

  第5點:配置數據源;

  第6點:報警郵箱,任務失敗後有失敗告警功能,可以通過發送郵箱來提醒;如果需要此功能,可以配置一下;

  • 5.2 啓動調度中心

本文是基於springboot項目整合的xxl-job,即執行啓動類XxlJobAdminApplication即可

  • 5.3 訪問調度中心管理界面

在瀏覽器輸入http://localhost:8080/xxl-job-admin,輸入用戶名和密碼(見配置文件),即出現如下管理界面

6.創建執行器項目

在源碼中,作者提供了各個版本的 執行器項目,此處以xxl-job-executor-sample-springboot項目爲例。也可以自己創建項目,然後按照demo或文檔進行改造。

  • 6.1 maven依賴

<!-- xxl-job-core -->
<dependency>
  <groupId>com.xuxueli</groupId>
   <artifactId>xxl-job-core</artifactId>
   <version>${project.parent.version}</version>
</dependency>
  • 6.2配置文件

#項目端口號
# web port
server.port=8081

#日誌文件
# 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:8080/xxl-job-admin

#執行器的名稱、ip地址、端口號
### xxl-job executor address
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=
xxl.job.executor.port=9999

#執行器通訊TOKEN:非空時啓用
### xxl-job, access token
xxl.job.accessToken=

#執行器運行日誌文件存儲的磁盤位置,需要對該路徑擁有讀寫權限
### xxl-job log path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
#執行器Log文件定期清理功能,指定日誌保存天數,日誌文件過期自動刪除。限制至少保持3天,否則功能不生效
#-1表示永不刪除
### xxl-job log retention days
xxl.job.executor.logretentiondays=-1

注意:配置執行器的名稱、IP地址、端口號,後面如果配置多個執行器時,要防止端口衝突

  • 6.3 載入配置文件XxlJobConfig.java

package com.xxl.job.executor.core.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.executor.appname}")
    private String appName;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean(initMethod = "start", destroyMethod = "destroy")
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppName(appName);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

    /**
     * 針對多網卡、容器內部署等情況,可藉助 "spring-cloud-commons" 提供的 "InetUtils" 組件靈活定製註冊IP;
     *
     *      1、引入依賴:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器啓動變量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、獲取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */

}
  • 6.4 創建任務JobHandler

項目中已提供的示例,可以參照創建自己的handler處理類

新建TestJobHandler執行器,僅打印幾行日誌,如下

package com.xxl.job.executor.service.jobhandler;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.stereotype.Component;

@Component
public class TestJobHandler {

    @XxlJob
    public ReturnT<String> execute(String param) throws Exception {
        XxlJobLogger.log("===my TestJobHandler===");

        for(int i=0; i<5; i++){
            XxlJobLogger.log("=== : " + i);
        }

        return SUCCESS;
    }

}

注意點:繼承IJobHandler類,添加註解@JobHandler(value = "testJobHandler")

  • 6.5 啓動執行器XxlJobExecutorApplication

7、在調度中心中配置執行器

前面已啓動xxl-job-admin調度中心,進入http://localhost:8080/xxl-job-admin 管理界面

  • 7.1 點擊  執行器管理--->新增執行器--->如下界面,然後填充此表格,點擊保存

參數介紹:

  AppName:是每個執行器集羣的唯一標示AppName, 執行器會週期性以AppName爲對象進行自動註冊。可通過該配置自動發現註冊成功的執行器, 供任務調度時使用;

  名稱:執行器的名稱, 因爲AppName限制字母數字等組成,可讀性不強, 名稱爲了提高執行器的可讀性;

  排序: 執行器的排序, 系統中需要執行器的地方,如任務新增, 將會按照該排序讀取可用的執行器列表;

  註冊方式:調度中心獲取執行器地址的方式,

    自動註冊:執行器自動進行執行器註冊,調度中心通過底層註冊表可以動態發現執行器機器地址;

    手動錄入:人工手動錄入執行器的地址信息,多地址逗號分隔,供調度中心使用;

  機器地址:"註冊方式"爲"手動錄入"時有效,支持人工維護執行器的地址信息;

  • 7.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所對應的任務的一次主動調度。
  任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
  失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
  報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;
  負責人:任務的負責人;
  執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;

8、啓動任務及查看日誌

  • 8.1 點擊"操作"按鈕,然後點擊"啓動"

  • 8.2 啓動後,點擊"調度日誌"

  • 8.3 點擊"調度備註"列的"查看"按鈕,顯示調度任務的基本信息

  • 8.4 點擊"操作"列的"執行日誌"按鈕,顯示如下

至此,xxl-job已搭建及使用完成,當然更多功能請參考文檔。

推薦閱讀

Spring Boot 最流行的 16 條實踐

SSM框架的面試常見問題

【分佈式】緩存穿透、緩存雪崩,緩存擊穿解決方案

阿里P7給出的一份超詳細 Spring Boot 知識清單

關注我每天進步一點點

你點的每個在看,我都認真當成了喜歡

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