基礎
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. 在調度中心注冊執行器
- 訪問調度中心管理界面:http://localhost:8080/xxl-job-admin
- 進入執行器管理頁面,點擊"新增":
- AppName:填寫
my-executor
(與執行器配置中的appname
一致) - 名稱:自定義(如"示例執行器")
- 注冊方式:選擇"自動注冊"
- 機器地址:無需填寫(自動注冊)
- AppName:填寫
- 點擊"保存"。
4. 創建并測試任務
- 進入任務管理頁面,點擊"新增":
- 執行器:選擇剛創建的
my-executor
- 任務描述:自定義(如"示例任務")
- 調度類型:選擇"固定速度"
- Cron:填寫
0/5 * * * * ?
(每5秒執行一次) - 任務Handler:填寫
demoJobHandler
(與任務處理器注解一致)
- 執行器:選擇剛創建的
- 點擊"保存",再點擊"啟動"。
- 查看調度日志,確認任務是否正常執行。
關鍵配置說明
組件 | 端口 | 用途 |
---|---|---|
調度中心 | 8081 | 管理界面和API服務 |
執行器應用 | 8080 | Spring Boot應用主端口 |
執行器內部服務 | 9999 | 接收調度中心的任務請求(無需外部訪問) |
補充
1.mysql-connector-j
依賴
mysql-connector-j
是 MySQL 官方提供的 Java 數據庫連接驅動(JDBC Driver),用于在 Java 應用程序中連接和操作 MySQL 數據庫。它是 MySQL 8.0 版本之后的標準驅動名稱,替代了舊的 mysql-connector-java
。
新舊版本對比
驅動名稱 | 適用 MySQL 版本 | 主要區別 |
---|---|---|
mysql-connector-java | 5.x 及以下 | 舊版驅動,已停止更新,最后版本為 8.0.31(支持 MySQL 5 和 8)。 |
mysql-connector-j | 8.0+ | 新版驅動,從 8.0.32 版本開始獨立為 mysql-connector-j ,僅支持 MySQL 8+。 |
常見問題與注意事項
-
版本兼容性:
- 若使用 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
。
- 若使用 MySQL 5.7,需切換回舊驅動:
-
JDBC URL 格式:
- MySQL 8+ 需要指定時區參數:
spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
- MySQL 8+ 需要指定時區參數:
選擇依據
- 檢查 MySQL 版本:
SELECT VERSION();
- 根據版本選擇對應的驅動依賴。