當前位置: 妍妍網 > 碼農

SpringBoot+XXL-JOB:高效定時任務管理

2024-07-14碼農

點選「 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的關鍵特點包括:

  1. 分布式任務排程: XXL-Job支持分布式任務排程,可以輕松處理任務分布在不同節點的情況。這對於大型微服務架構和集群環境非常有用。

  2. 彈性擴充套件: XXL-Job支持彈性擴充套件,你可以隨時增加或減少執行器節點,以適應不同負載和任務需求。這確保了高可用性和效能。

  3. 任務排程中心: XXL-Job提供了一個任務排程中心,可以集中管理和監控任務。你可以在Web界面上建立、編輯、刪除任務,檢視任務日誌和統計資訊。

  4. 多種任務型別: 支持多種任務型別,包括簡單的定時任務、Bean呼叫、Shell指令碼、HTTP任務、GLUE任務(動態語言任務),滿足各種任務需求。

  5. 任務依賴和失敗重試: XXL-Job允許你配置任務之間的依賴關系,確保任務按照指定的順序執行。同時,它支持失敗重試機制,確保任務在失敗時能夠重新執行。

  6. 報警和日誌: 提供了報警機制,可以透過信件、簡訊等方式通知任務執行結果。任務執行日誌也可以在Web界面中檢視,便於故障排查和監控。

  7. 開源和社群支持: 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:防止找不到本篇文章,可以收藏點贊,方便翻閱尋找哦。

    往期推薦