SpringBoot入門建站全系列(三十二)接入xxl-job分佈式任務調度平臺

SpringBoot入門建站全系列(三十二)接入xxl-job分佈式任務調度平臺

一、概述

XXL-JOB是一個輕量級分佈式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼並接入多家公司線上產品線,開箱即用。

但是我們到底用它來幹什麼呢?

我們都知道,Quartz是Java 編寫的開源作業調度框架,爲在 Java 應用程序中進行作業調度提供了簡單卻強大的機制,在《SpringBoot入門建站全系列(十五)內置定時任務及Quartz定時任務使用》 一篇中,已經講述了Quartz的使用方法。

而XXL-JOB正是基於Quartz,並將Quartz的功能進行封裝,作爲執行器,使其可以和一個統一的調度中心進行交互,將任務的調度管理交給調度中心處理,任務的執行交給Quartz執行。(XXL-JOB 2.1.0版本之後不再使用Quartz,但是本篇特意找到了使用Quartz的較新版本,2.0.1)。這樣,執行任務的每個機器相當於一個個客戶端,而調度中心則是各個客戶端的總管(調度中心也可以集羣化部署,但要公用一個數據庫)。

首發地址:

  品茗IT: https://www.pomit.cn/p/2412183455255041

如果大家正在尋找一個java的學習環境,或者在開發中遇到困難,可以加入我們的java學習圈,點擊即可加入,共同學習,節約學習時間,減少很多在學習中遇到的難題。

一、數據庫的初始化

需要先將xxl-job要求的表建好,地址是:https://gitee.com/xuxueli0323/xxl-job/tree/v2.0.1/doc/db 下的tables_xxl_job.sql文件。

如果不喜歡gitee,github地址是https://github.com/xuxueli/xxl-job

但是gitee的速度快。

把tables_xxl_job.sql的sql執行下,注意裏面的數據庫是xxl-job,可以改成自己的數據庫。

執行完成後,就出現這些表了:

在這裏插入圖片描述

二、調度中心的安裝

找到想要下載的版本的tag,比如我找的是2.0.1:https://gitee.com/xuxueli0323/xxl-job/tree/v2.0.1, 點擊下載。

注意,如果直接下載master,就是下載最新版本的xxl-job,可能不是你想要的。

2.0.1版本的xxl-job-admin改爲SpringBoot應用了。

解壓後,將xxl-job下的xxl-job-admin項目導入到工作臺,如圖所示:

在這裏插入圖片描述

我們要修改的就是application.properties文件,可以將端口修改下,數據庫地址密碼等肯定要修改地;郵箱地址也是要修改地;登錄用戶名等隨意。

改完之後,打包,運行jar包。

運行成功後打開: http://127.0.0.1:8080/xxl-job-admin/ 即可。

三、執行器

執行器就是一個運行任務的客戶端。需要註冊到調度中心去。

本文假設你已經引入spring-boot-starter-web。已經是個SpringBoot項目了,如果不會搭建,可以打開這篇文章看一看《SpringBoot入門建站全系列(一)項目建立》

首先,在調度中心新建執行器,這個步驟啥時候做其實都可以,如果想讓執行器自動註冊,需要在執行器啓動前在調度中心把執行器新建好。

3.1 調度中心新建執行器

選擇自動註冊,需要在執行器啓動前在調度中心把執行器新建好。手動註冊需要手動填入機器和端口列表。

在這裏插入圖片描述

建好後,執行器啓動之後,會自動註冊進來:

在這裏插入圖片描述

3.2 Maven依賴

需要引入xxl-job-core.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>com.xuxueli</groupId>
	<artifactId>xxl-job-core</artifactId>
	<version>2.0.1</version>
</dependency>

3.3 配置文件

在application.properties 中需要配置數據庫相關信息的信息,如:

### 調度中心部署跟地址 [選填]:如調度中心集羣部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回調";爲空則關閉自動註冊;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### 執行器AppName [選填]:執行器心跳註冊分組依據;爲空則關閉自動註冊
xxl.job.executor.appname=pomitcn

### 執行器IP [選填]:默認爲空表示自動獲取IP,多網卡時可手動設置指定IP,該IP不會綁定Host僅作爲通訊實用;地址信息用於 "執行器註冊" 和 "調度中心請求並觸發任務";
xxl.job.executor.ip=

### 執行器端口號 [選填]:小於等於0則自動獲取;默認端口爲9999,單機部署多個執行器時,注意要配置不同執行器端口;
xxl.job.executor.port=9999

### 執行器通訊TOKEN [選填]:非空時啓用;
xxl.job.accessToken=

### 執行器運行日誌文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權限;爲空則使用默認路徑;
xxl.job.executor.logpath=

### 執行器日誌保存天數 [選填] :值大於3時生效,啓用執行器Log文件定期清理功能,否則不生效;
xxl.job.executor.logretentiondays=-1

3.4 執行器配置

需要配置handler的位置、xxl.job的相關參數等。

package com.cff.springbootwork.xxljob.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.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * xxl-job config
 *
 */
@Configuration
@ComponentScan(basePackages = "com.cff.springbootwork.xxljob.jobhandler")
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;
    }

}

3.5 新建Job執行Handler

xxl-job提供了多種任務執行方式:GLUE模式(包含JAVA(groovy)、shell、php、nodejs、python等多種方式)和Bean模式;

一般情況下我們是使用Bean模式來定義任務,因爲這個是正常的JAVA開發人員的思維。而GLUE模式,是將代碼寫在表裏,動態執行。

這裏,我先講下怎麼使用Bean模式。

開發步驟(官方說明):

  1. 繼承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;
  2. 註冊到Spring容器:添加“@Component”註解,被Spring容器掃描爲Bean實例;
  3. 註冊到執行器工廠:添加“@JobHandler(value=“自定義jobhandler名稱”)”註解,註解value值對應的是調度中心新建任務的JobHandler屬性的值。
  4. 執行日誌:需要通過 “XxlJobLogger.log” 打印執行日誌;
package com.cff.springbootwork.xxljob.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;

import java.util.concurrent.TimeUnit;


/**
 * 任務Handler示例(Bean模式)
 *
 * 開發步驟:
 * 1、繼承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;
 * 2、註冊到Spring容器:添加“@Component”註解,被Spring容器掃描爲Bean實例;
 * 3、註冊到執行器工廠:添加“@JobHandler(value="自定義jobhandler名稱")”註解,註解value值對應的是調度中心新建任務的JobHandler屬性的值。
 * 4、執行日誌:需要通過 "XxlJobLogger.log" 打印執行日誌;
 *
 * @author xuxueli 2015-12-19 19:43:36
 */
@JobHandler(value="demoJobHandler")
@Component
public class DemoJobHandler extends IJobHandler {

	@Override
	public ReturnT<String> execute(String param) throws Exception {
		XxlJobLogger.log("XXL-JOB, Hello World.");
		System.out.println("test");
		for (int i = 0; i < 5; i++) {
			XxlJobLogger.log("beat at:" + i);
			TimeUnit.SECONDS.sleep(2);
		}
		return SUCCESS;
	}

}

四、測試任務執行

在調度中心的任務管理–> 新建任務:

在這裏插入圖片描述

建好以後,選擇執行器,可以看到當前任務狀態是stop:

在這裏插入圖片描述

可以點執行,也可以點啓動

執行: 只執行一次
啓動: 啓動定時任務,安裝cron表達式來執行。

我這裏點執行之後,任務執行一次,點擊日誌查看日誌記錄:

在這裏插入圖片描述

完成!

品茗IT-博客專題:https://www.pomit.cn/lecture.html彙總了Spring專題Springboot專題SpringCloud專題web基礎配置專題。

快速構建項目

Spring項目快速開發工具:

一鍵快速構建Spring項目工具

一鍵快速構建SpringBoot項目工具

一鍵快速構建SpringCloud項目工具

一站式Springboot項目生成

Mysql一鍵生成Mybatis註解Mapper

Spring組件化構建

SpringBoot組件化構建

SpringCloud服務化構建

喜歡這篇文章麼,喜歡就加入我們一起討論Java Web吧!
品茗IT交流羣

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