SpringBoot與XXL-JOB高效定時(shí)任務(wù)管理指南
前言
在現(xiàn)代應(yīng)用程序中,定時(shí)任務(wù)是不可或缺的一部分。Spring Boot 和 XXL-Job 為你提供了一個(gè)強(qiáng)大的工具組合,以簡(jiǎn)化任務(wù)調(diào)度和管理。
本文將帶領(lǐng)你探索如何將這兩者集成在一起,實(shí)現(xiàn)高效的定時(shí)任務(wù)管理。無(wú)論你是初學(xué)者還是有經(jīng)驗(yàn)的開(kāi)發(fā)者,本文都將提供你所需要的知識(shí),讓你輕松掌握這一技術(shù)。讓我們開(kāi)始吧!
一、XXL-Job簡(jiǎn)介
什么是XXL-job
官網(wǎng)地址:https://www.xuxueli.com/xxl-job/
XXL-Job是一個(gè)開(kāi)源的分布式任務(wù)調(diào)度平臺(tái),主要用于解決大規(guī)模分布式系統(tǒng)中的任務(wù)調(diào)度和管理問(wèn)題。下面是XXL-Job的簡(jiǎn)介,重點(diǎn)強(qiáng)調(diào)其分布式任務(wù)調(diào)度的特點(diǎn):
XXL-Job簡(jiǎn)介:
XXL-Job是一個(gè)基于Java開(kāi)發(fā)的分布式任務(wù)調(diào)度平臺(tái),旨在幫助開(kāi)發(fā)者和運(yùn)維人員管理和調(diào)度任務(wù),特別適用于大規(guī)模分布式應(yīng)用。它提供了直觀的Web界面,易于配置和監(jiān)控各種類型的任務(wù)。
XXL-Job的關(guān)鍵特點(diǎn)包括:
- 分布式任務(wù)調(diào)度: XXL-Job支持分布式任務(wù)調(diào)度,可以輕松處理任務(wù)分布在不同節(jié)點(diǎn)的情況。這對(duì)于大型微服務(wù)架構(gòu)和集群環(huán)境非常有用。
- 彈性擴(kuò)展: XXL-Job支持彈性擴(kuò)展,你可以隨時(shí)增加或減少執(zhí)行器節(jié)點(diǎn),以適應(yīng)不同負(fù)載和任務(wù)需求。這確保了高可用性和性能。
- 任務(wù)調(diào)度中心: XXL-Job提供了一個(gè)任務(wù)調(diào)度中心,可以集中管理和監(jiān)控任務(wù)。你可以在Web界面上創(chuàng)建、編輯、刪除任務(wù),查看任務(wù)日志和統(tǒng)計(jì)信息。
- 多種任務(wù)類型: 支持多種任務(wù)類型,包括簡(jiǎn)單的定時(shí)任務(wù)、Bean調(diào)用、Shell腳本、HTTP任務(wù)、GLUE任務(wù)(動(dòng)態(tài)語(yǔ)言任務(wù)),滿足各種任務(wù)需求。
- 任務(wù)依賴和失敗重試: XXL-Job允許你配置任務(wù)之間的依賴關(guān)系,確保任務(wù)按照指定的順序執(zhí)行。同時(shí),它支持失敗重試機(jī)制,確保任務(wù)在失敗時(shí)能夠重新執(zhí)行。
- 報(bào)警和日志: 提供了報(bào)警機(jī)制,可以通過(guò)郵件、短信等方式通知任務(wù)執(zhí)行結(jié)果。任務(wù)執(zhí)行日志也可以在Web界面中查看,便于故障排查和監(jiān)控。
- 開(kāi)源和社區(qū)支持: XXL-Job是開(kāi)源項(xiàng)目,擁有活躍的社區(qū)支持和持續(xù)的更新。你可以根據(jù)自己的需求進(jìn)行定制和擴(kuò)展。
XXL-Job的分布式任務(wù)調(diào)度特點(diǎn)使其成為處理大規(guī)模、復(fù)雜任務(wù)調(diào)度需求的強(qiáng)大工具。它可以幫助開(kāi)發(fā)團(tuán)隊(duì)更好地管理任務(wù),提高系統(tǒng)的可靠性和可維護(hù)性,同時(shí)降低了任務(wù)調(diào)度的復(fù)雜性。
對(duì)比別的任務(wù)調(diào)度
XXL-Job在分布式任務(wù)調(diào)度領(lǐng)域有其獨(dú)特之處,下面是它與其他一些任務(wù)調(diào)度解決方案的比較,以突出其優(yōu)勢(shì)和特點(diǎn):
Quartz:
- Quartz是一個(gè)強(qiáng)大的Java任務(wù)調(diào)度框架,但通常需要額外的配置和管理來(lái)支持分布式環(huán)境。XXL-Job提供了更易于配置和管理的分布式任務(wù)調(diào)度方案。
- XXL-Job的Web界面和報(bào)警機(jī)制更加現(xiàn)代化,便于任務(wù)管理和監(jiān)控。
Spring的@Scheduled:
- Spring的@Scheduled注解適用于單節(jié)點(diǎn)應(yīng)用程序,而XXL-Job專門設(shè)計(jì)用于分布式任務(wù)調(diào)度,支持在多個(gè)節(jié)點(diǎn)上執(zhí)行任務(wù)。
- XXL-Job提供了任務(wù)依賴和失敗重試的機(jī)制,以處理復(fù)雜任務(wù)流程。
Elastic Job:
- Elastic Job是另一個(gè)分布式任務(wù)調(diào)度框架,但XXL-Job更注重任務(wù)的可視化管理,提供了直觀的Web界面。
- XXL-Job的報(bào)警機(jī)制更加豐富,能夠及時(shí)通知任務(wù)執(zhí)行結(jié)果。
Akka Scheduler:
- Akka是一個(gè)并發(fā)編程庫(kù),它提供了定時(shí)任務(wù)功能,但相對(duì)更加復(fù)雜。XXL-Job更適合那些希望通過(guò)Web界面輕松管理任務(wù)的團(tuán)隊(duì)。
- XXL-Job的彈性擴(kuò)展特性使其適用于大規(guī)模分布式系統(tǒng)。
Cron4J:
- Cron4J是一個(gè)輕量級(jí)的Java定時(shí)任務(wù)庫(kù),適用于簡(jiǎn)單任務(wù)。XXL-Job提供了更多高級(jí)功能,如任務(wù)依賴、失敗重試和任務(wù)監(jiān)控。
總體而言,XXL-Job在分布式任務(wù)調(diào)度方面的優(yōu)勢(shì)在于其易用性、可視化管理、分布式支持、任務(wù)依賴和報(bào)警機(jī)制。它是一個(gè)強(qiáng)大的工具,特別適合需要大規(guī)模任務(wù)調(diào)度和監(jiān)控的應(yīng)用程序。
然而,具體選擇取決于項(xiàng)目需求,一些輕量級(jí)的解決方案可能在小型應(yīng)用中更加合適。
二、springboot整合XXL-job
配置XXL-Job Admin
拉取XXL-Job代碼
- 【gitee】
https://gitee.com/xuxueli0323/xxl-job
- 【github】
https://github.com/xuxueli/xxl-job/
上面的github和gitee都可以選擇,然后拉取下來(lái)
修改拉取的配置
1.執(zhí)行拉取下來(lái)的sql:/xxl-job/doc/db/tables_xxl_job.sql
2.修改調(diào)度中心配置/xxl-job/xxl-job-admin/src/main/resources/application.properties
### web,端口,這里我修改了,默認(rèn)是8080
server.port=9998
# 修改連接數(shù)據(jù)庫(kù)配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3361/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
### xxl-job, access token,注意這里的accessToken在執(zhí)行器中也需要配置(一致)
xxl.job.accessToken=eyJhbGciOiJIUzI1NiJ9
3.修改/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/logback.xml,否則可能會(huì)報(bào)錯(cuò)
<!-- 這里需要修改的值如下,不然會(huì)找不到日志路徑-->
<property name="log.path" value="./logs/xxl-job-admin.log"/>
4.訪問(wèn)http://127.0.0.1:9998/xxl-job-admin,這里端口是你上面配置的,輸入默認(rèn)的賬號(hào)密碼admin/123456
圖片
到這里調(diào)度中心就配置好了
配置執(zhí)行器
這里其實(shí)剛剛拉取的項(xiàng)目下就涵蓋了執(zhí)行器,包括無(wú)框架的以及springboot框架的
圖片
自己的項(xiàng)目如何整合
maven依賴
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
properties文件配置
### 調(diào)度中心部署根地址 [選填]:如調(diào)度中心集群部署存在多個(gè)地址則用逗號(hào)分隔。執(zhí)行器將會(huì)使用該地址進(jìn)行"執(zhí)行器心跳注冊(cè)"和"任務(wù)結(jié)果回調(diào)";為空則關(guān)閉自動(dòng)注冊(cè);這里的ip也是上面調(diào)度中心的
xxl.job.admin.addresses=http://127.0.0.1:9998/xxl-job-admin
### 執(zhí)行器通訊TOKEN [選填]:非空時(shí)啟用;這里的密碼是上面調(diào)度中心的
xxl.job.accessToken=eyJhbGciOiJIUzI1NiJ9
### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊(cè)分組依據(jù);為空則關(guān)閉自動(dòng)注冊(cè)
xxl.job.executor.appname=xxl-job-executor-xiaobo
### 執(zhí)行器注冊(cè) [選填]:優(yōu)先使用該配置作為注冊(cè)地址,為空時(shí)使用內(nèi)嵌服務(wù) ”IP:PORT“ 作為注冊(cè)地址。從而更靈活的支持容器類型執(zhí)行器動(dòng)態(tài)IP和動(dòng)態(tài)映射端口問(wèn)題。
xxl.job.executor.address=
### 執(zhí)行器IP [選填]:默認(rèn)為空表示自動(dòng)獲取IP,多網(wǎng)卡時(shí)可手動(dòng)設(shè)置指定IP,該IP不會(huì)綁定Host僅作為通訊實(shí)用;地址信息用于 "執(zhí)行器注冊(cè)" 和 "調(diào)度中心請(qǐng)求并觸發(fā)任務(wù)";
xxl.job.executor.ip=
### 執(zhí)行器端口號(hào) [選填]:小于等于0則自動(dòng)獲??;默認(rèn)端口為9999,單機(jī)部署多個(gè)執(zhí)行器時(shí),注意要配置不同執(zhí)行器端口;
xxl.job.executor.port=9999
### 執(zhí)行器運(yùn)行日志文件存儲(chǔ)磁盤(pán)路徑 [選填] :需要對(duì)該路徑擁有讀寫(xiě)權(quán)限;為空則使用默認(rèn)路徑;
xxl.job.executor.logpath=./logs/xxl-job/jobhandler
### 執(zhí)行器日志文件保存天數(shù) [選填] : 過(guò)期日志自動(dòng)清理, 限制值大于等于3時(shí)生效; 否則, 如-1, 關(guān)閉自動(dòng)清理功能;
xxl.job.executor.logretentinotallow=30
執(zhí)行器組件配置
package com.todoitbo.baseSpringbootDasmart.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Slf4j
public class XxlJobConfig {
@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
public XxlJobSpringExecutor xxlJobExecutor() {
log.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;
}
}
jobhandler配置
package com.todoitbo.baseSpringbootDasmart.handler;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
@Component
public class JobHandler {
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
}
}
拉取下來(lái)的代碼中/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java是更詳細(xì)的配置
實(shí)現(xiàn)效果
1.啟動(dòng)項(xiàng)目,出現(xiàn)如下即成功。
2.任務(wù)調(diào)度頁(yè)面中加入執(zhí)行器。
圖片
3.配置任務(wù)。
圖片
4.啟動(dòng)任務(wù)。
??:這里如果你要執(zhí)行一次的話,機(jī)器地址一定是帶http的,比如http://127.0.0.1:9999
如果是啟動(dòng)的話,先點(diǎn)擊注冊(cè)節(jié)點(diǎn),再啟動(dòng)即可
三、@XxlJob中參數(shù)詳解
以下是這三個(gè)參數(shù)的詳細(xì)說(shuō)明:
- value:
- 參數(shù)類型: String
- 說(shuō)明: 任務(wù)的名字,必須是唯一的。在XXL-Job Admin中配置任務(wù)時(shí),這個(gè)值用于標(biāo)識(shí)任務(wù)。
- init:
- 參數(shù)類型: String
- 說(shuō)明: 任務(wù)初始化時(shí)的方法名。這個(gè)方法會(huì)在任務(wù)第一次執(zhí)行前被調(diào)用,通常用于初始化一些資源。方法必須是無(wú)參數(shù)的。
- destroy:
- 參數(shù)類型: String
- 說(shuō)明: 任務(wù)銷毀時(shí)的方法名。這個(gè)方法會(huì)在任務(wù)最后一次執(zhí)行后被調(diào)用,通常用于釋放資源。方法必須是無(wú)參數(shù)的。
這三個(gè)參數(shù)是@XxlJob注解的基本參數(shù),用于定義任務(wù)的基本屬性。
四、最佳實(shí)踐
使用Spring Boot和XXL-Job進(jìn)行任務(wù)調(diào)度是一種強(qiáng)大的方式,但也有一些常見(jiàn)的錯(cuò)誤和最佳實(shí)踐,以下是一些建議,幫助讀者避免這些錯(cuò)誤并在實(shí)際項(xiàng)目中取得成功:
詳細(xì)記錄任務(wù)日志:記錄任務(wù)的執(zhí)行日志是非常重要的,它可以幫助你追蹤任務(wù)的執(zhí)行情況,及時(shí)發(fā)現(xiàn)問(wèn)題。確保在任務(wù)Handler中添加詳細(xì)的日志信息。
- 參數(shù)校驗(yàn): 在任務(wù)Handler中對(duì)傳遞的參數(shù)進(jìn)行合法性校驗(yàn),以避免不必要的異常和錯(cuò)誤。
- 任務(wù)冪等性: 確保任務(wù)的邏輯是冪等的,即多次執(zhí)行不會(huì)產(chǎn)生不同的結(jié)果。這對(duì)于任務(wù)失敗后的重試非常重要。
- 失敗處理: 配置任務(wù)的失敗處理策略,包括重試次數(shù)、重試間隔等。這可以幫助應(yīng)對(duì)臨時(shí)問(wèn)題,如網(wǎng)絡(luò)故障或資源不足。
- 任務(wù)依賴: 如果任務(wù)之間存在依賴關(guān)系,確保在XXL-Job Admin中正確配置任務(wù)的依賴關(guān)系,以保證任務(wù)按照正確的順序執(zhí)行。
- 動(dòng)態(tài)調(diào)度: 利用XXL-Job的動(dòng)態(tài)調(diào)度功能來(lái)應(yīng)對(duì)實(shí)時(shí)需求的變化,如動(dòng)態(tài)調(diào)整任務(wù)觸發(fā)時(shí)間、任務(wù)取消、任務(wù)延遲等。
- 監(jiān)控與報(bào)警: 集成監(jiān)控和報(bào)警系統(tǒng),可以幫助你實(shí)時(shí)監(jiān)測(cè)任務(wù)的執(zhí)行情況,及時(shí)發(fā)現(xiàn)問(wèn)題并采取措施。XXL-Job提供了與監(jiān)控系統(tǒng)的集成支持。
- 版本管理: 使用版本控制工具(如Git)來(lái)管理任務(wù)Handler代碼,以便跟蹤任務(wù)邏輯的變化和恢復(fù)歷史版本。
- 測(cè)試任務(wù)邏輯: 在開(kāi)發(fā)任務(wù)Handler時(shí)進(jìn)行充分的單元測(cè)試,確保任務(wù)邏輯的正確性。XXL-Job提供了一些測(cè)試工具,如JobLogger。
- 集群部署: 如果需要,部署XXL-Job執(zhí)行器節(jié)點(diǎn)以提高任務(wù)的可用性和負(fù)載均衡。
- 版本升級(jí): 定期關(guān)注XXL-Job的更新版本,確保使用最新的穩(wěn)定版本,以獲得最新的功能和 bug 修復(fù)。
- 安全性: 保護(hù)XXL-Job Admin的訪問(wèn)權(quán)限,防止未經(jīng)授權(quán)的訪問(wèn)。不要在任務(wù)邏輯中存儲(chǔ)敏感信息。
- 文檔和培訓(xùn): 提供適當(dāng)?shù)奈臋n和培訓(xùn),以便項(xiàng)目團(tuán)隊(duì)了解如何使用XXL-Job和任務(wù)調(diào)度最佳實(shí)踐。
遵循這些最佳實(shí)踐可以幫助你更好地使用Spring Boot和XXL-Job,確保任務(wù)調(diào)度系統(tǒng)的可靠性和穩(wěn)定性。這對(duì)于生產(chǎn)環(huán)境中的任務(wù)調(diào)度至關(guān)重要。