天天看點

五分鐘體驗分布式排程架構xxl-job

XXL-JOB是一個分布式任務排程平台,其核心設計目标是開發迅速、學習簡單、輕量級、易擴充。現已開放源代碼并接入多家公司線上産品線,開箱即用。

本教程主要介紹怎麼在spring boot工程中快速使用xxl-job。詳細的xxl-job的使用文檔請參考:https://www.xuxueli.com/xxl-job/

簡介

在xxl-job中,有2個角色:

  • 一個是排程任務管理系統,xll-job-admin
  • 另一個是xxl-job-excutor,通常是我們業務系統,比如本案例的springboot業務系統。

整個排程任務執行流程如下:

  • Xxl-job-admin官方代碼已經寫好,不做定制化開發的話,直接啟動即可正常運作。啟動Xxl-job-admin工程。
  • xxl-job-excuotr需要配置xxl-job-admin的位址,主動向Xxl-job-admin注冊,并建立netty連接配接。在xxl-job-excutor中需要實作excutor的業務代碼。
五分鐘體驗分布式排程架構xxl-job

xxl-job-admin

Xxl-job-admin是排程任務的管理中心。所有的excutor都會向xxl-job-admin注冊,注冊完成之後可以對excutor進行任務分發。

在官網中下載下傳最新的release代碼,比如本文中的v2.2.0版本,下載下傳位址為https://github.com/xuxueli/xxl-job/releases。

Xxl-job-admin需要Mysql資料庫,請提前準備安裝好。然後在資料庫中導入代碼工程中的doc/sql目錄下的s ql檔案。

然後修改xxl-job-admin工程中的resources中的application.properties的資料庫配置,如下:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver           

複制

修改之後,啟動XxlJobAdminApplication的main函數,xxl-job-admin啟動成功。

在浏覽器上通路http://localhost:8081/xxl-job-admin/ ,登陸使用者名為admin,密碼為123456。登陸成功後,顯示的界面如下:

五分鐘體驗分布式排程架構xxl-job

xxl-job-excutor

xxl-job-excutor是任務的執行單元,需要在業務系統中去實作。本案例中是一個springboot的工程,此工程需要內建xxl-job作為任務執行單元。在工程的pom.xml檔案中引入xxl-job-core的依賴如下:

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

複制

在工程的application.properties中配置xxl.job.admin.addresses的位址,配置含義見注釋,具體配置如下:

# web port
server.port=8082
# no web
#spring.main.web-environment=false

# 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:8081/xxl-job-admin

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

### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=../applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30           

複制

需要初始化一個XxlJobSpringExecutor,該類用于處理xxl-job-admin和xxl-job-excutor之間的通訊以及任務的處理。

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

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

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

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

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

    @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.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }
}           

複制

注冊一個任務,任務名為demoJobHandler。

@Component
public class SampleXxlJob {
    private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);


    /**
     * 1、簡單任務示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public ReturnT<String> demoJobHandler(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World.");
        logger.info("XXL-JOB, Hello World. params:"+param);
        for (int i = 0; i < 5; i++) {
            XxlJobLogger.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        return ReturnT.SUCCESS;
    }
 }           

複制

在xxl-job-admin中可以看到demoJobHandler的配置,在控制台啟動任務。

五分鐘體驗分布式排程架構xxl-job

啟動任務後,可以看到執行任務的日志。同時在xxl-job-excutor中可以看到任務執行的業務日志。

五分鐘體驗分布式排程架構xxl-job

源碼下載下傳

https://github.com/forezp/distributed-lab/tree/master/xxl-job