https://www.bilibili.com/video/BV1WT4y1U7Vr?spm_id_from=333.999.0.0
在開發(fā)中需要將已有的定時任務(wù)抽離出來,方便管理查看,因此選擇集成分布式任務(wù)調(diào)度平臺 XXL-JOB熔掺,本文就講解下 Spring Boot 如何集成 XXL-JOB 任務(wù)調(diào)度平臺。
XXL-JOB 簡介
XXL-JOB是一個分布式任務(wù)調(diào)度平臺叭披,其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單玩讳、輕量級趋观、易擴(kuò)展】盖荩現(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用皱坛。
下面我們在 Spring Boot 中集成 XXL-JOB 來完成定時任務(wù)的編寫(本文選擇的 XXL-JOB 版本為 2.2.0)编曼。
Spring Boot 集成 XXL-JOB
Spring Boot 集成 XXL-JOB 主要分為以下兩步:
配置運行調(diào)度中心(xxl-job-admin)
配置運行執(zhí)行器項目(xxl-job-executor)
配置運行調(diào)度中心
首先從源碼倉庫中下載代碼,代碼地址有兩個:
GitHub:https://github.com/xuxueli/xxl-job
Gitee:http://gitee.com/xuxueli0323/xxl-job
下載完之后剩辟,在?doc/db?目錄下有數(shù)據(jù)庫腳本?tables_xxl_job.sql掐场,執(zhí)行下腳本初始化調(diào)度數(shù)據(jù)庫?xxl_job,如下圖所示:
可以根據(jù)需要修改 xxl-job-admin 的配置文件贩猎,主要是修改數(shù)據(jù)源信息熊户,若需要用到郵件報警功能,需要配置郵箱吭服。
然后啟動項目嚷堡,正常啟動后,訪問地址為:http://localhost:8080/xxl-job-admin艇棕,默認(rèn)的賬戶為 admin蝌戒,密碼為 123456,訪問后臺管理系統(tǒng)后臺沼琉,界面如下:
這樣就表示調(diào)度中心已經(jīng)搞定了北苟,下一步就是創(chuàng)建執(zhí)行器項目。
配置運行執(zhí)行器項目
創(chuàng)建一個項目打瘪,在項目中加入 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.2.0</version>
</dependency>
加入配置
在配置文件?application.properties?中配置 xxl-job 執(zhí)行器的相關(guān)參數(shù),具體內(nèi)容如下:
### 調(diào)度中心部署跟地址 [選填]:如調(diào)度中心集群部署存在多個地址則用逗號分隔闺骚。執(zhí)行器將會使用該地址進(jìn)行"執(zhí)行器心跳注冊"和"任務(wù)結(jié)果回調(diào)"彩扔;為空則關(guān)閉自動注冊;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 執(zhí)行器通訊TOKEN [選填]:非空時啟用僻爽;
xxl.job.accessToken=
### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊分組依據(jù)借杰;為空則關(guān)閉自動注冊
xxl.job.executor.appname=xxl-job-executor
### 執(zhí)行器注冊 [選填]:優(yōu)先使用該配置作為注冊地址,為空時使用內(nèi)嵌服務(wù) ”IP:PORT“ 作為注冊地址进泼。從而更靈活的支持容器類型執(zhí)行器動態(tài)IP和動態(tài)映射端口問題。
xxl.job.executor.address=
### 執(zhí)行器IP [選填]:默認(rèn)為空表示自動獲取IP纤虽,多網(wǎng)卡時可手動設(shè)置指定IP乳绕,該IP不會綁定Host僅作為通訊時用;地址信息用于 "執(zhí)行器注冊" 和 "調(diào)度中心請求并觸發(fā)任務(wù)"逼纸;
xxl.job.executor.ip=
### 執(zhí)行器端口號 [選填]:小于等于0則自動獲妊蟠搿;默認(rèn)端口為9999杰刽,單機(jī)部署多個執(zhí)行器時菠发,注意要配置不同執(zhí)行器端口王滤;
xxl.job.executor.port=9999
### 執(zhí)行器運行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權(quán)限;為空則使用默認(rèn)路徑滓鸠;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 執(zhí)行器日志文件保存天數(shù) [選填] : 過期日志自動清理, 限制值大于等于3時生效; 否則, 如-1, 關(guān)閉自動清理功能雁乡;
xxl.job.executor.logretentiondays=30
其中指定了上一步部署的調(diào)度中心的地址和執(zhí)行器的相關(guān)參數(shù)。
然后在 config 包下創(chuàng)建?XxlJobConfiguration?類糜俗,會從配置文件中讀取到對應(yīng)的參數(shù)踱稍,接著申明一個?xxlJobExecutor?方法,返回的是一個?XxlJobSpringExecutor悠抹,這個方法主要是如何初始化并創(chuàng)建一個?XxlJobSpringExecutor珠月。
@Configuration
public class XxlJobConfiguration {
? ? private Logger logger = LoggerFactory.getLogger(XxlJobConfiguration.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.");
? ? ? ? // registry jobhandler
? ? ? ? XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler());
? ? ? ? // init executor
? ? ? ? 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;
? ? }
}
接下來就可以創(chuàng)建任務(wù)了。
編寫 JobHandler
在這里主要演示下 Bean 模式的任務(wù)楔敌,可以基于類和方法進(jìn)行開發(fā)啤挎,下面先介紹基于類的開發(fā)的任務(wù)。
BEAN模式(類形式)
首先創(chuàng)建一個類?BeanClassJobHandler卵凑,繼承?IJobHandler?實現(xiàn)?execute?方法庆聘,然后通過?XxlJobLogger.log?來打印日志。
@Component
public class BeanClassJobHandler extends IJobHandler {
? ? @Override
? ? public ReturnT<String> execute(String param) throws Exception {
? ? ? ? XxlJobLogger.log("bean class jobhandler running...");
? ? ? ? return ReturnT.SUCCESS;
? ? }
}
基于類開發(fā)的任務(wù)需要手動注冊到執(zhí)行器工廠氛谜,具體代碼如下所示:
XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler());
到此一個任務(wù)就開發(fā)完成了掏觉,下面介紹下基于方法的開發(fā)方式:
BEAN模式(方法形式)
基于方法開發(fā)的任務(wù)比較簡單,編寫一個方法值漫,并添加?@XxlJob?注解澳腹,會自動掃描該任務(wù)并注入到執(zhí)行器容器。
@Component
public class BeanMethodJobHandler {
? ? @XxlJob("beanMethodJobHandler")
? ? public ReturnT<String> beanMethodJobHandler(String param) throws Exception {
? ? ? ? XxlJobLogger.log("bean method jobhandler running...");
? ? ? ? return ReturnT.SUCCESS;
? ? }
}
至此杨何,執(zhí)行器項目就開發(fā)完成了酱塔,啟動項目,在執(zhí)行器管理頁面添加該執(zhí)行器危虱。
執(zhí)行器添加完成后羊娃,需要在任務(wù)管理界面添加我們剛才開發(fā)的兩個任務(wù),下面以 BEAN 模式方法任務(wù)為例:
點擊保存后埃跷,一個定時任務(wù)就完成了蕊玷,是不是很簡單呢?
下面啟動任務(wù)來查看下執(zhí)行結(jié)果弥雹,在這里點擊“執(zhí)行一次”垃帅,然后查詢執(zhí)行日志,結(jié)果如下圖:
可以看到我們的任務(wù)已經(jīng)成功執(zhí)行了剪勿,至此贸诚,Spring Boot 集成 XXL-JOB 任務(wù)調(diào)度平臺就完成了。
總結(jié)
Spring Boot 與 XXL-JOB 的集成是不是很簡單呢?在這里只是簡單地入門酱固,想要了解更多可以看下官方文檔:https://www.xuxueli.com/xxl-job械念。
還沒有使用過的可以通過本文快速上手,來實操起來吧运悲!