Spring Cloud微服务搭建三、分布式任务调度XXL-JOB

目录

为什么使用XXL-JOB

Xxl-job使用

集成

组件版本清单


为什么使用XXL-JOB

XXL-JOB是一个轻量级分布式任务调度平台。特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展。是国内任务调度领域的标杆项目,许雪里老师的设计兼顾了易用性与功能完整性。依赖组件少,集成简单。在通用性、易用性、功能完整性上有巨大优势,适合大多数场景。

  1. 可视化管理界面:Xxl-job 提供直观、易用的可视化管理界面,让我们能够方便地管理和监控定时任务。
  2. 分布式任务调度:对于分布式系统,Xxl-job 提供了强大的分布式任务调度能力,可以轻松地实现任务在集群中的分发和执行。
  3. 任务执行日志:Xxl-job 支持任务执行日志的记录和查看,这有助于及时发现和解决任务执行中的问题。
  4. 支持动态增删任务:Xxl-job允许在项目运行或上线后动态添加和删除任务,无需停止整个服务。
  5. 代码入侵较低:定时任务相对独立,代码入侵比较严重的框架肯定是不会考虑的,而xxl-job完全采用注解方式,使用成本低,且兼容性较好。

提供‌全功能Web控制台‌,支持任务监控、日志查看、报警策略配置等操作,无需编程即可实现动态管理。(其实是集成了Quartz后发现没有现成的图形化界面,不想自己实现偷懒用XXL-JOB)

https://www.xuxueli.com/

Xxl-job使用

首先去gitee拉取xxl-job的项目源码,建议选用较新且稳定的版本

这里拉取最新版本:xxl-job-2.5.0

项目地址:https://gitee.com/xuxueli0323/xxl-job

首先在doc文件夹下找到源码中带的sql脚本文件,在本地mysql下运行该脚本文件,之后就可以生成一个调度中心的数据库,该数据库主要用于对后面调度中心配置的一些数据进行存储和统计。

配置中心主要配置

数据库生成完毕后,需要去调度中心的配置文件中对调度中心进行配置,

启动admin服务,访问默认地址:

即可进入调度中心首页,默认登录账号 "admin/123456", 登录后运行界面如下图所示:

集成

复制代码
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.5.0</version>
        </dependency>

yml

复制代码
xxl:
  job:
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin
    executor:
      # 执行器名称
      appname: xxl-job-executor
      # 可选,不配置则自动获取
      ip:
      port: 9999
      # 日志路径
      logpath: /data/applogs/xxl-job/jobhandler
      # 日志保留天数
      logretentiondays: 30
    accessToken:

logging:
  level:
    com.xxl.job: DEBUG

XxlJobConfig

复制代码
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author admin
 * @date 2026/1/11 22:07
 */
@Configuration
@Slf4j
public class XxlJobConfig {

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @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.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        log.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }
}

SampleXxlJob

复制代码
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author admin
 * @date 2026/1/11 22:08
 */
@Component
@Slf4j
public class SampleXxlJob {

    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World.");

        String param = XxlJobHelper.getJobParam();
        XxlJobHelper.log("param: " + param);

        TimeUnit.SECONDS.sleep(2);
        XxlJobHelper.log("beat at:" + System.currentTimeMillis());
        log.info("demoJobHandler執行結束");
    }

    @XxlJob("shardingJobHandler")
    public void shardingJobHandler() throws Exception {
        // 分片参数
        int shardIndex = XxlJobHelper.getShardIndex();
        int shardTotal = XxlJobHelper.getShardTotal();

        XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);

        // 业务逻辑
        for (int i = 0; i < shardTotal; i++) {
            if (i == shardIndex) {
                XxlJobHelper.log("第 {} 片, 命中分片", i);
            } else {
                XxlJobHelper.log("第 {} 片, 忽略", i);
            }
        }
        log.info("shardingJobHandler執行結束");
    }

}

创建执行器和任务

启动项目

执行和查看日志

组件版本清单

当前Spring Cloud 微服务组件版本清单

  • JDK: 1.8
  • MySQL: 8.0.33
  • Nacos 2.2
  • Spring Boot2.7.18
  • Spring Cloud2021.0.9
  • Spring Cloud Alibaba 2021.0.5.0
  • Hutool5.8.25
  • Lombok 1.18.26
  • XxlJob2.5.0

最后

在选择分布式调度引擎的时候,发现了一个有意思的分布式调度方案JobFlow,感兴趣的可以看看

JobFlow 是面向业务中台的轻量级、高性能分布式调度引擎,专为 Nacos 体系打造,在不引入任何新中间件的前提下,将任务调度、动态分片和延时队列能力内建到微服务架构之中。

地址:https://gitee.com/sh_wangwanbao/job-flow

相关推荐
言慢行善21 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
专吃海绵宝宝菠萝屋的派大星21 小时前
使用Dify对接自己开发的mcp
java·服务器·前端
大数据新鸟21 小时前
操作系统之虚拟内存
java·服务器·网络
Tong Z21 小时前
常见的限流算法和实现原理
java·开发语言
凭君语未可21 小时前
Java 中的实现类是什么
java·开发语言
He少年21 小时前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
克里斯蒂亚诺更新1 天前
myeclipse的pojie
java·ide·myeclipse
迷藏4941 天前
**eBPF实战进阶:从零构建网络流量监控与过滤系统**在现代云原生架构中,**网络可观测性**和**安全隔离**已成为
java·网络·python·云原生·架构
迷藏4941 天前
**发散创新:基于Solid协议的Web3.0去中心化身份认证系统实战解析**在Web3.
java·python·web3·去中心化·区块链
qq_433502181 天前
Codex cli 飞书文档创建进阶实用命令 + Skill 创建&使用 小白完整教程
java·前端·飞书