XXL-JOB:分布式任務(wù)調(diào)度平臺詳解及使用案例

2024-12-27 11:41 更新

XXL-JOB是一個分布式任務(wù)調(diào)度平臺,由國人謝旺(Xie Wang)開發(fā)。它主要解決了在分布式系統(tǒng)中關(guān)于任務(wù)調(diào)度、定時執(zhí)行、任務(wù)分片、失敗重試、任務(wù)依賴等方面的問題。XXL-JOB提供了一個簡單、易用、功能強大的解決方案,適用于需要定時執(zhí)行任務(wù)的業(yè)務(wù)場景。

XXL-JOB的主要特點包括:

  1. 易于使用:XXL-JOB提供了簡潔的API和Web界面,使得任務(wù)的創(chuàng)建、管理和監(jiān)控變得非常容易。
  2. 分布式架構(gòu):支持多機分布式部署,可以水平擴展,提高調(diào)度系統(tǒng)的可用性和負(fù)載能力。
  3. 執(zhí)行器隔離:提供了多種執(zhí)行器類型,包括BEAN模式、GLUE模式等,以適應(yīng)不同的任務(wù)執(zhí)行需求。
  4. 任務(wù)分片:支持任務(wù)分片處理,可以將一個大任務(wù)分割成多個小任務(wù)并行執(zhí)行,提高任務(wù)處理效率。
  5. 失敗重試:支持任務(wù)失敗后的重試機制,可以根據(jù)不同的策略進行重試。
  6. 阻塞處理:提供了阻塞處理策略,當(dāng)執(zhí)行器資源不足時,可以采取不同的策略來處理新任務(wù)。
  7. 任務(wù)依賴:支持任務(wù)之間的依賴關(guān)系,可以設(shè)置任務(wù)的上游和下游,實現(xiàn)復(fù)雜的任務(wù)流。
  8. 可視化界面:提供了一個Web管理界面,可以方便地進行任務(wù)的增刪改查和調(diào)度監(jiān)控。
  9. 彈性擴縮:支持在線動態(tài)添加或移除執(zhí)行器節(jié)點,無需停止服務(wù)。

XXL-JOB適用于需要定時任務(wù)調(diào)度的各種場景,如定時數(shù)據(jù)同步、定時數(shù)據(jù)備份、定時報告生成、定時任務(wù)觸發(fā)等。它可以幫助開發(fā)者從繁瑣的任務(wù)調(diào)度管理中解放出來,專注于業(yè)務(wù)邏輯的開發(fā)。

定時任務(wù)調(diào)度案例

XXL-JOB 的代碼實現(xiàn)涉及到幾個不同的部分,包括調(diào)度中心、執(zhí)行器以及任務(wù)的配置。下面我將提供一個簡單的示例,展示如何使用 XXL-JOB 實現(xiàn)一個定時任務(wù)調(diào)度場景。

要使用 XXL-JOB 實現(xiàn)一個定時任務(wù)調(diào)度場景,你需要設(shè)置調(diào)度中心和執(zhí)行器。下面這個示例使用 XXL-JOB 創(chuàng)建一個定時任務(wù),開整。

步驟 1:添加 XXL-JOB 依賴

首先,你需要在執(zhí)行器項目的 pom.xml 文件中添加 XXL-JOB 的依賴:

<dependencies>
    <!-- XXL-JOB -->
    <dependency>
        <groupId>com.xuxueli</groupId>


        <artifactId>xxl-job-core</artifactId>


        <version>2.3.0</version>


    </dependency>


</dependencies>

步驟 2:創(chuàng)建執(zhí)行器項目

創(chuàng)建一個 Spring Boot 項目作為執(zhí)行器。

XxlJobExecutorApplication.java

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class XxlJobExecutorApplication {


    public static void main(String[] args) {
        // 啟動執(zhí)行器
        XxlJobSpringExecutor.scheduleJob();
        SpringApplication.run(XxlJobExecutorApplication.class, args);
    }
}

application.properties

xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=
xxl.job.executor.port=9999
xxl.job.accessToken=
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30

步驟 3:創(chuàng)建任務(wù)處理器

創(chuàng)建一個任務(wù)處理器類,用于執(zhí)行具體的任務(wù)邏輯。

TestJobHandler.java

import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;


@Component
public class TestJobHandler {


    @XxlJob("testJobHandler")
    public void testJob() {
        System.out.println("執(zhí)行測試任務(wù)");
        // 任務(wù)邏輯
    }
}

步驟 4:配置 XXL-JOB 調(diào)度中心

調(diào)度中心通常是一個獨立的項目,你可以從 XXL-JOB 的官方 GitHub 倉庫下載源碼并運行。

步驟 5:在 XXL-JOB 管理平臺添加任務(wù)

  1. 啟動調(diào)度中心和執(zhí)行器。
  2. 訪問 XXL-JOB 管理平臺(默認(rèn)地址:http://127.0.0.1:8080/xxl-job-admin。
  3. 登錄平臺(默認(rèn)用戶名和密碼都是 admin)。
  4. 創(chuàng)建新任務(wù),填寫任務(wù)描述,選擇執(zhí)行器(步驟 2 中配置的 appname),設(shè)置 Cron 表達式(例如 0/5 * * * * ? 表示每 5 秒執(zhí)行一次)。
  5. 執(zhí)行器選擇 下拉菜單中選擇你配置的執(zhí)行器。
  6. 保存任務(wù)。

步驟 6:測試任務(wù)

在 XXL-JOB 管理平臺,啟動創(chuàng)建的任務(wù),觀察任務(wù)日志,確保任務(wù)按照預(yù)期執(zhí)行。

任務(wù)分片業(yè)務(wù)場景案例

任務(wù)分片(Sharding)是分布式任務(wù)調(diào)度中的一種常見需求,它允許將一個大任務(wù)分割成多個小任務(wù),分散到不同的執(zhí)行器上并行執(zhí)行。XXL-JOB 支持任務(wù)分片,可以通過分片參數(shù)來實現(xiàn)。

以下是一個使用 XXL-JOB 實現(xiàn)任務(wù)分片的業(yè)務(wù)場景案例:

步驟 1:定義分片參數(shù)

在 XXL-JOB 的管理界面中,創(chuàng)建任務(wù)時可以設(shè)置分片參數(shù)。例如,可以將分片參數(shù)設(shè)置為 0=1,1=2,2=3,這意味著任務(wù)將被分成3個分片,每個分片負(fù)責(zé)一部分?jǐn)?shù)據(jù)。

步驟 2:創(chuàng)建分片任務(wù)處理器

在執(zhí)行器項目中,創(chuàng)建一個任務(wù)處理器類,用于處理分片任務(wù)。

ShardingJobHandler.java

import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.context.XxlJobHelper;


public class ShardingJobHandler {


    @XxlJob("shardingJobHandler")
    public void shardingJobHandler() throws Exception {
        // 獲取分片參數(shù)
        String shardingParam = XxlJobHelper.getJobParam();
        String[] shards = shardingParam.split(",");
        if (shards.length != 3) {
            throw new IllegalArgumentException("分片參數(shù)不正確");
        }


        // 獲取當(dāng)前分片項
        int shardIndex = XxlJobHelper.getShardIndex();
        int shardTotal = XxlJobHelper.getShardTotal();


        System.out.println("分片參數(shù):" + shardingParam);
        System.out.println("當(dāng)前分片項:" + shardIndex + ", 總分片數(shù):" + shardTotal);


        // 執(zhí)行分片任務(wù)邏輯
        for (int i = 0; i < shards.length; i++) {
            if (i == shardIndex) {
                // 模擬業(yè)務(wù)邏輯
                System.out.println("分片 " + i + " 執(zhí)行業(yè)務(wù)邏輯");
                // 假設(shè)這里是業(yè)務(wù)邏輯代碼
                Thread.sleep(1000); // 模擬耗時任務(wù)
            }
        }
    }
}

步驟 3:配置 XXL-JOB 執(zhí)行器

確保執(zhí)行器已經(jīng)正確配置,并且能夠連接到 XXL-JOB 的調(diào)度中心。

application.properties

xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=
xxl.job.executor.port=9999
xxl.job.accessToken=
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30

步驟 4:在 XXL-JOB 管理平臺配置任務(wù)

  1. 登錄 XXL-JOB 管理平臺。
  2. 創(chuàng)建新任務(wù),選擇執(zhí)行器和分片參數(shù)。
  3. 在“JobHandler”字段中輸入 shardingJobHandler。
  4. 設(shè)置“分片參數(shù)”為 0=1,1=2,2=3。
  5. 保存并啟動任務(wù)。

步驟 5:測試任務(wù)

在 XXL-JOB 管理平臺啟動任務(wù),觀察任務(wù)日志,確保每個分片按預(yù)期執(zhí)行。

小結(jié)一下

  • 分片參數(shù):在任務(wù)創(chuàng)建時設(shè)置,格式為 分片項=分片數(shù),用逗號分隔不同的分片項。
  • 任務(wù)處理器:在任務(wù)處理器中,通過 XxlJobHelper 獲取分片參數(shù)和當(dāng)前分片索引,然后執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。
  • 執(zhí)行器配置:確保執(zhí)行器能夠連接到調(diào)度中心,并且任務(wù)處理器類已經(jīng)被 Spring 管理。

XXL-JOB 可以幫助我們將一個復(fù)雜的任務(wù)分割成多個小任務(wù),并在多個執(zhí)行器上并行執(zhí)行,從而提高任務(wù)處理的效率和速度。

文末感謝各位一鍵三連。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號