1. 程式人生 > >分布式任務調度平臺xxl-job的使用(java)

分布式任務調度平臺xxl-job的使用(java)

jdb 啟動 extends 好的 nic broadcast 心跳 return mode

  xxl-job是一個開源的任務調度平臺(github地址https://github.com/xuxueli/xxl-job),且在分布式場景下有很好的支持性,可以對單個的任務單次執行,或者定時執行。在分布式場景下,可以選擇不同的路由策略進行執行job,如指定第一個或最後一個執行器執行,輪詢執行等等,十分的靈活,下面介紹下在java環境下如何對接xxl-job的平臺。

  一、調度中心的配置部署

  xxl-job作為開源的項目,他支持多種語言的任務,但是其調度平臺是由java語言編寫,基於集群Quartz實現的。調度平臺負責任務的分發,路由,執行周期,執行策略等,首先從github上(https://github.com/xuxueli/xxl-job)下載該項目,然後在文件路徑為/xxl-job/xxl-job-admin/src/main/resources/下找到配置文件xxl-job-admin.properties,進行如下配置

### 調度中心JDBC鏈接:鏈接地址請保持和 2.1章節 所創建的調度數據庫的地址一致
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

### 報警郵箱
spring.mail.host=smtp.qq.com
spring.mail.port
=25 spring.mail.username=[email protected] 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 ### 登錄賬號 xxl.job.login.username=admin xxl.job.login.password=123456 ### 調度中心通訊TOKEN,非空時啟用 xxl.job.accessToken
= ### 調度中心國際化設置,默認為中文版本,值設置為“en”時切換為英文版本 xxl.job.i18n=

然後將項目啟動,訪問http://localhost:8080/xxl-job-admin ,即可看到xxl-job的頁面

技術分享圖片

  二、配置java的執行器

  xxl-job的調度器全部是開源的代碼,只需要修改配置即可,執行器部分就需要我們自己進行開發,首先,pom.xml文件中引入依賴

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>1.8.2</version>
</dependency>

然後在你的執行器的項目中的配置文件中加入xxl-job相關配置

#xxl-job 調度中心工程的地址
xxl.job.admin.addresses=http://localhost:8999/xxl-job-admin

### xxl-job executor address
xxl.job.executor.appname=xxl-job-ots-server
xxl.job.executor.ip=
xxl.job.executor.port=9946

### xxl-job log path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/

### xxl-job, access token
xxl.job.accessToken=

然後編寫xxl-job配置類

package com.test.config;

import com.xxl.job.core.executor.XxlJobExecutor;
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.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.test.task")
//basePackages指向實現了接口IJobHandle的類所在包
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

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

    @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.executor.logpath}")
    private String logpath;

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

    @Bean(initMethod = "start", destroyMethod = "destroy")
    public XxlJobExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobExecutor xxlJobExecutor = new XxlJobExecutor();
        xxlJobExecutor.setIp(ip);
        xxlJobExecutor.setPort(port);
        xxlJobExecutor.setAppName(appname);
        xxlJobExecutor.setAdminAddresses(addresses);
        xxlJobExecutor.setLogPath(logpath);
        xxlJobExecutor.setAccessToken(accessToken);
        return xxlJobExecutor;
    }

}
!

最後編寫xxl-job的執行器的類

package com.test.task;

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

@Component
@JobHander(value="testHello")//@JobHander 唯一標識一個任務。調度中心會查找這個唯一的名稱來啟動執行此類的execute方法。
public class HelloWorld extends IJobHandler {
    @Override
    public ReturnT<String> execute(String... strings) throws Exception {
        System.out.println("hello,boy.");
        return ReturnT.SUCCESS;
    }
}

然後將含有xxl-job執行器的項目啟動即可

  三、任務的執行

  首先,配置執行器

技術分享圖片

然後在任務管理界面配置任務

技術分享圖片

任務配置界面各參賽含有如下

- 執行器:任務的綁定的執行器,任務觸發調度時將會自動發現註冊成功的執行器, 實現任務自動發現功能; 另一方面也可以方便的進行任務分組。每個任務必須綁定一個執行器, 可在 "執行器管理" 進行設置;
- 任務描述:任務的描述信息,便於任務管理;
- 路由策略:當執行器集群部署時,提供豐富的路由策略,包括;
    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所對應的任務的一次主動調度。
- 任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
- 失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
- 報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;
- 負責人:任務的負責人;
- 執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;

我們上面配置的項目就是BEAN模式的,其他模式的代碼都會維護在調度平臺裏。

分布式任務調度平臺xxl-job的使用(java)