分布式定時任務:xxl-job

基礎

XXL - Job采用的是調度中心(Scheduler)與執行器(Executor)分離的架構設計,這種設計帶來了諸多優勢,比如高可用性、可擴展性以及便于分布式部署等。

1. 調度中心(XXL - Job Admin)

這是一個獨立的Web應用,負責任務的管理和調度工作。

  • 主要功能
    • 提供可視化的管理界面,方便用戶管理任務、執行器以及查看調度日志。
    • 按照預設的調度策略觸發任務。
    • 監控任務的執行狀態,并在任務執行異常時進行報警。
    • 管理執行器的注冊和發現過程。
  • 技術特點
    • 基于Spring Boot開發,可獨立部署。
    • 需要連接數據庫(支持MySQL等)來存儲任務配置和調度日志。
  • 部署方式
    • 至少部署一個實例,若要實現高可用,則需部署多個實例并通過Nginx進行負載均衡。

2. 執行器(Executor)

執行器是嵌入在業務系統中的組件,負責實際執行任務。

  • 主要功能
    • 注冊到調度中心,讓調度中心知道自己的存在。
    • 接收調度中心發送的任務執行請求。
    • 執行具體的業務邏輯,并將執行結果返回給調度中心。
  • 技術特點
    • 以Jar包的形式集成到業務系統中,目前支持Java、Python等語言。
    • 支持自動注冊和手動注冊兩種方式與調度中心建立連接。
  • 部署方式
    • 可以和業務系統部署在同一服務器上,也能獨立部署。
    • 支持集群部署,從而實現水平擴展。

示例

下面為你提供XXL - Job調度中心與執行器分開部署啟動的示例,該示例適用于生產環境或測試環境:

1. 部署調度中心(XXL - Job Admin)

步驟1:創建數據庫

首先創建名為xxl - job的數據庫,然后執行官方SQL腳本:

-- 創建數據庫
CREATE DATABASE xxl_job DEFAULT CHARACTER SET utf8mb4;-- 導入SQL腳本(從GitHub獲取)
-- https://github.com/xuxueli/xxl-job/blob/master/doc/db/tables_xxl_job.sql
步驟2:下載調度中心源碼

從GitHub下載XXL - Job源碼并解壓:

git clone https://github.com/xuxueli/xxl-job.git
cd xxl-job/xxl-job-admin

注意:可以選擇只保留 xxl-job-admin 模塊,然后通過 Maven 引入 xxl-job-core 依賴,這樣的方式能讓項目結構更加簡潔,同時也便于依賴管理和后續的升級維護等操作

步驟3:配置調度中心

修改application.properties文件:

# 服務器端口
server.port=8081# 數據庫配置
spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 訪問令牌(可選)
xxl.job.accessToken=
步驟4: 驗證啟動

運行main方法(無需打包),調度中心會在8081端口啟動。
訪問管理界面:http://localhost:8080/xxl-job-admin
默認賬號:admin,密碼:123456

2. 創建執行器項目(Spring Boot應用)

步驟1:創建Spring Boot項目

添加以下依賴到pom.xml

<dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- XXL-Job 執行器 --><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.1</version></dependency>
</dependencies>
步驟2:配置執行器

創建執行器配置類:

package com.example.demo.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
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;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {XxlJobSpringExecutor executor = new XxlJobSpringExecutor();executor.setAdminAddresses(adminAddresses);executor.setAppname(appname);executor.setIp(ip);executor.setPort(port);executor.setAccessToken(accessToken);executor.setLogPath(logPath);executor.setLogRetentionDays(logRetentionDays);return executor;}
}
步驟3:配置application.properties
# 執行器服務端口
server.port=8081# XXL-Job 配置
xxl.job.admin.addresses=http://localhost:8080/xxl-job-admin  # 調度中心地址
xxl.job.executor.appname=my-executor                              # 執行器名稱(需在管理界面注冊)
xxl.job.executor.ip=                                               # 自動獲取IP
xxl.job.executor.port=9999                                         # 執行器內部服務端口
xxl.job.accessToken=                                               # 訪問令牌(與調度中心一致)
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler         # 日志路徑
xxl.job.executor.logretentiondays=30                              # 日志保留天數
步驟4:創建任務處理器
package com.example.demo.job;import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;@Component
public class SampleJobHandler {@XxlJob("demoJobHandler")public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-Job任務執行中");// 業務邏輯...XxlJobHelper.handleSuccess("任務執行成功");}
}
步驟5:啟動執行器

運行Spring Boot應用主類:

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

3. 在調度中心注冊執行器

  1. 訪問調度中心管理界面:http://localhost:8080/xxl-job-admin
  2. 進入執行器管理頁面,點擊"新增":
    • AppName:填寫my-executor(與執行器配置中的appname一致)
    • 名稱:自定義(如"示例執行器")
    • 注冊方式:選擇"自動注冊"
    • 機器地址:無需填寫(自動注冊)
  3. 點擊"保存"。

4. 創建并測試任務

  1. 進入任務管理頁面,點擊"新增":
    • 執行器:選擇剛創建的my-executor
    • 任務描述:自定義(如"示例任務")
    • 調度類型:選擇"固定速度"
    • Cron:填寫0/5 * * * * ?(每5秒執行一次)
    • 任務Handler:填寫demoJobHandler(與任務處理器注解一致)
  2. 點擊"保存",再點擊"啟動"。
  3. 查看調度日志,確認任務是否正常執行。

關鍵配置說明

組件端口用途
調度中心8081管理界面和API服務
執行器應用8080Spring Boot應用主端口
執行器內部服務9999接收調度中心的任務請求(無需外部訪問)

補充

1.mysql-connector-j 依賴

mysql-connector-j 是 MySQL 官方提供的 Java 數據庫連接驅動(JDBC Driver),用于在 Java 應用程序中連接和操作 MySQL 數據庫。它是 MySQL 8.0 版本之后的標準驅動名稱,替代了舊的 mysql-connector-java

新舊版本對比
驅動名稱適用 MySQL 版本主要區別
mysql-connector-java5.x 及以下舊版驅動,已停止更新,最后版本為 8.0.31(支持 MySQL 5 和 8)。
mysql-connector-j8.0+新版驅動,從 8.0.32 版本開始獨立為 mysql-connector-j,僅支持 MySQL 8+。
常見問題與注意事項
  1. 版本兼容性

    • 若使用 MySQL 5.7,需切換回舊驅動:
      <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version> <!-- 最后兼容 MySQL 5 的版本 -->
      </dependency>
      
    • 若使用 MySQL 8.0+,推薦使用 mysql-connector-j
  2. JDBC URL 格式

    • MySQL 8+ 需要指定時區參數:
      spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
      
選擇依據
  1. 檢查 MySQL 版本:
    SELECT VERSION();
    
  2. 根據版本選擇對應的驅動依賴。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913267.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

易語言實現釘釘PC端高頻率鏈接批量打開系統

易語言實現釘釘PC端高頻率鏈接批量打開系統 一、需求分析與技術方案 核心需求: 在釘釘PC端私聊消息中嵌入特殊格式鏈接用戶點擊后通過自定義協議喚醒本地程序支持每分鐘處理10萬次請求的批量操作實現鏈接的批量生成和管理技術方案: #mermaid-svg-AYoMWYQQf71dlyEF {font-fa…

MyBatis如何實現動態數據源切換?

大家好&#xff0c;我是鋒哥。今天分享關于【MyBatis如何實現動態數據源切換&#xff1f;】面試題。希望對大家有幫助&#xff1b; MyBatis如何實現動態數據源切換&#xff1f; 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; 在MyBatis中實現動態數據源切換&#…

實踐篇:14-構建 Node.js 應用程序鏡像

背景介紹 Node.js是一個基于 Chrome V8 引擎的 JavaScript 運行時環境&#xff0c;以其事件驅動、非阻塞 I/O 模型而聞名&#xff0c;廣泛用于構建后端服務和前端應用。 Node.js 的特點使其非常適合容器化部署&#xff1a; 輕量級運行時&#xff1a;相比傳統后端語言&#xf…

Spring Cloud 微服務(鏈路追蹤與日志聚合)

&#x1f4cc; 摘要 在微服務架構中&#xff0c;隨著服務數量的增加和調用關系的復雜化&#xff0c;傳統的日志記錄方式已經無法滿足對系統運行狀態的全面掌控。如何快速定位異常請求、分析服務調用耗時、追蹤完整鏈路成為運維和開發人員面臨的核心挑戰。 為此&#xff0c;Sp…

PADS交互式布局

PADS的交互式布局通過原理圖與PCB的雙向聯動大幅提升設計效率。在原理圖中框選電路模塊時&#xff0c;PCB視圖將自動高亮對應元件組并生成可移動簇&#xff0c;拖動時保持模塊內部相對位置不變。布局過程中啟用實時推擠功能&#xff08;Placement Shoving&#xff09;&#xff…

類圖+案例+代碼詳解:軟件設計模式----原型模式

5、原型模式 通過復制現有對象來創建新對象&#xff0c;避免從零開始構建&#xff0c;就像 “復印文件” 一樣。 克隆的核心是復用現有對象狀態 用 克隆熊貓 舉例&#xff0c;秒懂原理 假設你有一只熊貓對象&#xff08;屬性&#xff1a;名字、年齡、毛色&#xff09;&#…

Python-FAQ-__name__、__main__

1 需求 2 接口 3 示例 4 參考資料 在 Python 中&#xff0c;像 __name__ 這樣的雙下劃線屬性&#xff08;也稱為 "dunder" 屬性&#xff0c;即 "double underscore" 的縮寫&#xff09;是 Python 的特殊屬性或方法&#xff0c;它們為類、對象或模塊提供了…

Adobe高階技巧與設計師創意思維的進階指南

作為一名在全球設計圈摸爬滾打了十年的職業設計師&#xff0c;我深知創意與技術的結合是點燃靈感的火花。憑借英國Parvis School of Economics and Music大學提供的Adobe正版教育訂閱&#xff0c;我得以在設計之路上不斷探索與突破。今天&#xff0c;我想以輕松實用的口吻&…

音視頻會議服務搭建(設計方案-Go服務端API業務邏輯流程圖)-04

前言 這一篇是 關于 Go服務端相關的音視頻會議的接口API業務邏輯流程圖肯定是不能完全復用到你的項目中去的&#xff0c;但是希望對你有一些參考性的幫助嗯&#xff0c;我也是在不斷的進行完善和優化&#xff0c;并不是最終的結構&#xff0c;先定好大方向&#xff0c;然后不斷…

C++ Qt Widget繪圖畫布縮放與平移:實現CAD級交互體驗

在圖形應用程序開發中&#xff0c;實現流暢的縮放和平移功能是創建專業級繪圖工具的基礎。本文將深入探討如何在Qt Widget中實現CAD級別的交互體驗&#xff0c;包括視圖變換、坐標系統管理以及交互功能實現。核心概念&#xff1a;視圖變換與坐標系統 在圖形應用中&#xff0c;我…

Paimon 位圖索引解析:高效等值查詢的秘密( Bit-Sliced Index)

BitmapFileIndexBitmapFileIndex 這個類 是 Paimon 中一個非常重要的索引類型&#xff0c;它使用位圖&#xff08;Bitmap&#xff09;來精確定位數據&#xff0c;尤其擅長處理低基數&#xff08;low-cardinality&#xff09;列的等值查詢。BitmapFileIndex 實現了 FileIndexer …

S7-1200 CPU 與 S7-200 CPU S7通信(S7-1200 作為服務器

7-1200 CPU 與 S7-200 CPU S7通信&#xff08;S7-1200 作為服務器&#xff09; S7-1200 CPU 與 S7-200 CPU 之間的通信只能通過 S7 通信來實現&#xff0c;因為 S7-200 的以太網模塊只支持S7 通信。當S7-200作為客戶端&#xff0c;S7-1200作為服務器&#xff0c;需在客戶端單邊…

pyspark大規模數據加解密優化實踐

假如有1億行數據 方法1 spark udf解密 from pyspark.sql import SparkSession import pyspark.sql.functions as F from pyDes import * import binasciisparkSparkSession.builder.getOrCreate()def dec_fun(text):key triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CB…

華為云Flexus+DeepSeek征文|華為云ECS與CCE:從介紹到架構部署·僅需要此文足矣

前引&#xff1a;當今的企業面臨著前所未有的技術挑戰&#xff1a;如何構建既安全又高效、既靈活又可靠的云服務架構&#xff1f;如何有效整合人工智能技術&#xff0c;打造智能化的運維和服務體系&#xff1f;這些問題的答案&#xff0c;正在悄然改變著企業級IT基礎設施的生態…

DAY 50 預訓練模型+CBAM模塊

浙大疏錦行https://blog.csdn.net/weixin_45655710 知識點回顧&#xff1a; resnet結構解析CBAM放置位置的思考針對預訓練模型的訓練策略 差異化學習率三階段微調 作業&#xff1a; 好好理解下resnet18的模型結構嘗試對vgg16cbam進行微調策略 ResNet-18 結構核心思想 可以將R…

docker連接mysql

查看在運行的容器&#xff1a;docker ps -s 進入容器&#xff1a;docker exec -it 容器號或名 /bin/bash&#xff0c;如&#xff1a;docker exec -it c04c438ff177 /bin/bash 或docker exec -it mysql /bin/bash。 3. 登錄mysql&#xff1a;mysql -uroot -p123456

javaweb第182節Linux概述~ 虛擬機連接不上FinalShell

問題描述 虛擬機無法連接到finalshell 報錯 session.connect:java.net.socketexception:connection reset 或者 connection is closed by foreign host 解決 我經過一系列的排查&#xff0c;花費了一天的時間后&#xff0c;發現&#xff0c;只是因為&#xff0c;我將連接…

高壓電纜護層安全的智能防線:TLKS-PLGD 監控設備深度解析

在現代電力系統龐大復雜的網絡中&#xff0c;高壓電纜護層是守護電力傳輸的 "隱形鎧甲"&#xff0c;其安全直接影響電網穩定。傳統監測手段響應慢、精度低&#xff0c;難以滿足安全運維需求。TLKS-PLGD 高壓電纜護層環流監控設備應運而生&#xff0c;提供智能化解決方…

Element-Plus Cascader 級聯選擇器獲取節點名稱和value值方法

html 部分 <template><el-cascaderref"selectAeraRef":options"areas":disabled"disabled":props"optionProps"v-model"selectedOptions"filterablechange"handleChange"><template #default"…

STM32中實現shell控制臺(命令解析實現)

文章目錄一、核心設計思想二、命令系統實現詳解&#xff08;含完整注釋&#xff09;1. 示例命令函數實現2. 初始化命令系統3. 命令注冊函數4. 命令查找函數5. 命令執行函數三、命令結構體&#xff08;cmd\_t&#xff09;四、運行效果示例五、小結在嵌入式系統的命令行控制臺&am…