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模式。
開發步驟(官方說明):
- 繼承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;
- 註冊到Spring容器:添加“@Component”註解,被Spring容器掃描爲Bean實例;
- 註冊到執行器工廠:添加“@JobHandler(value=“自定義jobhandler名稱”)”註解,註解value值對應的是調度中心新建任務的JobHandler屬性的值。
- 執行日誌:需要通過 “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項目快速開發工具:
喜歡這篇文章麼,喜歡就加入我們一起討論Java Web吧!