当前位置: 首页 > news >正文

分布式定时任务: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.dtcms.com/a/264747.html

相关文章:

  • 苍穹外卖day12--Apache POI导出Excel报表
  • [MIA 2025]CLIP in medical imaging: A survey
  • 多云密钥统一管理实战:CKMS对接阿里云/华为云密钥服务
  • .npmrc和.yarnrc配置文件介绍:分别用于 Node.js 中的 npm(Node Package Manager)和 Yarn 包管理工具
  • oracle集合三嵌套表(Nested Table)学习
  • 【第三章:神经网络原理详解与Pytorch入门】01.神经网络算法理论详解与实践-(1)神经网络预备知识(线性代数、微积分、概率等)
  • 微控制器中的EXTI0(External Interrupt 0)中断是什么?
  • uniapp socket 封装 (可拿去直接用)
  • 可编辑33页PPT | 某材料制造企业工业互联网平台解决方案
  • 云原生环境下部署大语言模型服务:以 DeepSeek 为例的实战教程
  • 6种iOS开发中常用的设计模式
  • Qt designer坑-布局内子控件的顺序错乱
  • 量化交易学习之自动化交易策略 [freqtrade 框架学习] ,常见问题避坑指南!!!!
  • <u>#12288;#8203;</u> HTML5全角空格,自动换行,半角用#32;#8203;
  • Spring AI Advisor RAG使用指南
  • Android Auto即将带来变革
  • AI大模型:从编码助手到流程重构者——软件开发新范式解析
  • 【前端】1 小时实现 React 简历项目
  • 多种方法实现golang中实现对http的响应内容生成图片
  • MySQL间隙锁详解:解决幻读的「隐形守护者」
  • React 学习(2)
  • 03-JS资料
  • 企业需要什么样的远程桌面管理软件?
  • 不引入变量 异或交换的缺点
  • 替代进口SCA7606【智芯微】国产高精度电流传感器 工业新能源电网专用
  • openai-agents记忆持久化(neo4j)
  • WPF学习笔记(21)ListBox、ListView与控件模板
  • 深入理解 LoRA:大语言模型微调的低秩魔法
  • PyTorch 不支持旧GPU的异常状态与解决方案:CUDNN_STATUS_NOT_SUPPORTED_ARCH_MISMATCH
  • Spring Boot 高并发框架实现方案:数字城市的奇妙之旅