點選「 IT碼徒 」, 關註,置頂 公眾號
每日技術幹貨,第一時間送達!
前言
在現代應用程式中,定時任務是不可或缺的一部份。Spring Boot 和 XXL-Job 為你提供了一個強大的工具組合,以簡化任務排程和管理。
本文將帶領你探索如何將這兩者整合在一起,實作高效的定時任務管理。無論你是初學者還是有經驗的開發者,本文都將提供你所需要的知識,讓你輕松掌握這一技術。讓我們開始吧!
一、XXL-Job簡介
什麽是XXL-job
官網地址:
「
https://www.xuxueli.com/xxl-job/
XXL-Job是一個開源的分布式任務排程平台,主要用於解決大規模分布式系統中的任務排程和管理問題。下面是XXL-Job的簡介,重點強調其分布式任務排程的特點:
XXL-Job簡介:
XXL-Job是一個基於Java開發的分布式任務排程平台,旨在幫助開發者和運維人員管理和排程任務,特別適用於大規模分布式套用。它提供了直觀的Web界面,易於配置和監控各種型別的任務。
XXL-Job的關鍵特點包括:
分布式任務排程: XXL-Job支持分布式任務排程,可以輕松處理任務分布在不同節點的情況。這對於大型微服務架構和集群環境非常有用。
彈性擴充套件: XXL-Job支持彈性擴充套件,你可以隨時增加或減少執行器節點,以適應不同負載和任務需求。這確保了高可用性和效能。
任務排程中心: XXL-Job提供了一個任務排程中心,可以集中管理和監控任務。你可以在Web界面上建立、編輯、刪除任務,檢視任務日誌和統計資訊。
多種任務型別: 支持多種任務型別,包括簡單的定時任務、Bean呼叫、Shell指令碼、HTTP任務、GLUE任務(動態語言任務),滿足各種任務需求。
任務依賴和失敗重試: XXL-Job允許你配置任務之間的依賴關系,確保任務按照指定的順序執行。同時,它支持失敗重試機制,確保任務在失敗時能夠重新執行。
報警和日誌: 提供了報警機制,可以透過信件、簡訊等方式通知任務執行結果。任務執行日誌也可以在Web界面中檢視,便於故障排查和監控。
開源和社群支持: XXL-Job是開源計畫,擁有活躍的社群支持和持續的更新。你可以根據自己的需求進行客製和擴充套件。
XXL-Job的分布式任務排程特點使其成為處理大規模、復雜任務排程需求的強大工具。它可以幫助開發團隊更好地管理任務,提高系統的可靠性和可維護性,同時降低了任務排程的復雜性。
對比別的任務排程
XXL-Job在分布式任務排程領域有其獨特之處,下面是它與其他一些任務排程解決方案的比較,以突出其優勢和特點:
Quartz:
Quartz是一個強大的Java任務排程框架,但通常需要額外的配置和管理來支持分布式環境。XXL-Job提供了更易於配置和管理的分布式任務排程方案。
XXL-Job的Web界面和報警機制更加現代化,便於任務管理和監控。
Spring的@Scheduled:
Spring的@Scheduled註解適用於單節點應用程式,而XXL-Job專門設計用於分布式任務排程,支持在多個節點上執行任務。
XXL-Job提供了任務依賴和失敗重試的機制,以處理復雜任務流程。
Elastic Job:
Elastic Job是另一個分布式任務排程框架,但XXL-Job更註重任務的視覺化管理,提供了直觀的Web界面。
XXL-Job的報警機制更加豐富,能夠及時通知任務執行結果。
Akka Scheduler:
Akka是一個並行編程庫,它提供了定時任務功能,但相對更加復雜。XXL-Job更適合那些希望透過Web界面輕松管理任務的團隊。
XXL-Job的彈性擴充套件特性使其適用於大規模分布式系統。
Cron4J:
Cron4J是一個輕量級的Java定時任務庫,適用於簡單任務。XXL-Job提供了更多高級功能,如任務依賴、失敗重試和任務監控。
總體而言,XXL-Job在分布式任務排程方面的優勢在於其易用性、視覺化管理、分布式支持、任務依賴和報警機制。它是一個強大的工具,特別適合需要大規模任務排程和監控的應用程式。
然而,具體選擇取決於計畫需求,一些輕量級的解決方案可能在小型套用中更加合適。
二、springboot整合XXL-job
配置XXL-Job Admin
拉取XXL-Job程式碼
【gitee】
「
https://gitee.com/xuxueli0323/xxl-job
【github】
「
https://github.com/xuxueli/xxl-job/
上面的github和gitee都可以選擇,然後拉取下來
修改拉取的配置
1.執行拉取下來的sql:
/xxl-job/doc/db/tables_xxl_job.sql
2.修改排程中心配置
/xxl-job/xxl-job-admin/src/main/resources/application.properties
### web,埠,這裏我修改了,預設是8080
server.port=9998
# 修改連線資料庫配置
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在執行器中也需要配置(一致)
xxl.job.accessToken=eyJhbGciOiJIUzI1NiJ9
3.修改
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/logback.xml
,否則可能會報錯
<!-- 這裏需要修改的值如下,不然會找不到日誌路徑-->
<propertyname="log.path"value="./logs/xxl-job-admin.log"/>
4.存取
http://127.0.0.1:9998/xxl-job-admin
,這裏埠是你上面配置的,輸入預設的帳號密碼admin/123456
到這裏排程中心就配置好了
配置執行器
這裏其實剛剛拉取的計畫下就涵蓋了執行器,包括無框架的以及springboot框架的
自己的計畫如何整合
maven依賴
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
properties檔配置
### 排程中心部署根地址 [選填]:如排程中心集群部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回呼";為空則關閉自動註冊;這裏的ip也是上面排程中心的
xxl.job.admin.addresses=http://127.0.0.1:9998/xxl-job-admin
### 執行器通訊TOKEN [選填]:非空時啟用;這裏的密碼是上面排程中心的
xxl.job.accessToken=eyJhbGciOiJIUzI1NiJ9
### 執行器AppName [選填]:執行器心跳註冊分組依據;為空則關閉自動註冊
xxl.job.executor.appname=xxl-job-executor-xiaobo
### 執行器註冊 [選填]:優先使用該配置作為註冊地址,為空時使用內嵌服務 」IP:PORT「 作為註冊地址。從而更靈活的支持容器型別執行器動態IP和動態對映埠問題。
xxl.job.executor.address=
### 執行器IP [選填]:預設為空表示自動獲取IP,多網卡時可手動設定指定IP,該IP不會繫結Host僅作為通訊實用;地址資訊用於 "執行器註冊" 和 "排程中心請求並觸發任務";
xxl.job.executor.ip=
### 執行器埠號 [選填]:小於等於0則自動獲取;預設埠為9999,單機部署多個執行器時,註意要配置不同執行器埠;
xxl.job.executor.port=9999
### 執行器執行日誌檔儲存磁盤路徑 [選填] :需要對該路徑擁有讀寫許可權;為空則使用預設路徑;
xxl.job.executor.logpath=./logs/xxl-job/jobhandler
### 執行器日誌檔保存天數 [選填] : 過期日誌自動清理, 限制值大於等於3時生效; 否則, 如-1, 關閉自動清理功能;
xxl.job.executor.logretentiondays=30
執行器元件配置
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;
/**
* @author xiaobo
* @date 2023/10/24
*/
@Configuration
@Slf4j
public classXxlJobConfig{
@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}")
privateint port;
@Value("${xxl.job.accesstoken}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
privateint 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;
/**
* @author xiaobo
* @date 2023/10/24
*/
@Component
public classJobHandler{
@XxlJob("demoJobHandler")
publicvoiddemoJobHandler()throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
}
}
拉取下來的程式碼中
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java
是更詳細的配置
實作效果
1.啟動計畫,出現如下即成功
2.任務排程頁面中加入執行器
3.配置任務
4.啟動任務
⚠️:這裏如果你要執行一次的話,機器地址一定是帶http的,比如
http://127.0.0.1:9999
如果是啟動的話,先點選註冊節點,再啟動即可
三、@XxlJob中參數詳解
以下是這三個參數的詳細說明:
value:
參數型別: String
說明: 任務的名字,必須是唯一的。在XXL-Job Admin中配置任務時,這個值用於標識任務。
init:
參數型別: String
說明: 任務初始化時的方法名。這個方法會在任務第一次執行前被呼叫,通常用於初始化一些資源。方法必須是無參數的。
destroy:
參數型別: String
說明: 任務銷毀時的方法名。這個方法會在任務最後一次執行後被呼叫,通常用於釋放資源。方法必須是無參數的。
這三個參數是@XxlJob註解的基本參數,用於定義任務的基本內容。
四、最佳實踐
使用Spring Boot和XXL-Job進行任務排程是一種強大的方式,但也有一些常見的錯誤和最佳實踐,以下是一些建議,幫助讀者避免這些錯誤並在實際計畫中取得成功:
詳細記錄任務日誌:記錄任務的執行日誌是非常重要的,它可以幫助你追蹤任務的執行情況,及時發現問題。確保在任務Handler中添加詳細的日誌資訊。
參數校驗: 在任務Handler中對傳遞的參數進行合法性校驗,以避免不必要的異常和錯誤。
任務冪等性: 確保任務的邏輯是冪等的,即多次執行不會產生不同的結果。這對於任務失敗後的重試非常重要。
失敗處理: 配置任務的失敗處理策略,包括重試次數、重試間隔等。這可以幫助應對臨時問題,如網路故障或資源不足。
任務依賴: 如果任務之間存在依賴關系,確保在XXL-Job Admin中正確配置任務的依賴關系,以保證任務按照正確的順序執行。
動態排程: 利用XXL-Job的動態排程功能來應對即時需求的變化,如動態調整任務觸發時間、任務取消、任務延遲等。
監控與報警: 整合監控和報警系統,可以幫助你即時監測任務的執行情況,及時發現問題並采取措施。XXL-Job提供了與監控系統的整合支持。
版本管理: 使用版本控制工具(如Git)來管理任務Handler程式碼,以便跟蹤任務邏輯的變化和恢復歷史版本。
測試任務邏輯: 在開發任務Handler時進行充分的單元測試,確保任務邏輯的正確性。XXL-Job提供了一些測試工具,如JobLogger。
集群部署: 如果需要,部署XXL-Job執行器節點以提高任務的可用性和負載均衡。
版本升級: 定期關註XXL-Job的更新版本,確保使用最新的穩定版本,以獲得最新的功能和 bug 修復。
安全性: 保護XXL-Job Admin的存取許可權,防止未經授權的存取。不要在任務邏輯中儲存敏感資訊。
文件和培訓: 提供適當的文件和培訓,以便計畫團隊了解如何使用XXL-Job和任務排程最佳實踐。
遵循這些最佳實踐可以幫助你更好地使用Spring Boot和XXL-Job,確保任務排程系統的可靠性和穩定性。這對於生產環境中的任務排程至關重要。
來源:https://blog.csdn.net/Mrxiao_bo
— END —
PS:防止找不到本篇文章,可以收藏點贊,方便翻閱尋找哦。
往期推薦