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

相关推荐
Re.不晚2 小时前
深入底层理解HashMap——妙哉妙哉的结构!!
java·哈希算法
Serene_Dream2 小时前
Java 内存区域
java·jvm
爱吃山竹的大肚肚2 小时前
文件上传大小超过服务器限制
java·数据库·spring boot·mysql·spring
黄昏恋慕黎明2 小时前
测试模型讲解
java
瑞雪兆丰年兮2 小时前
[从0开始学Java|第十二天]学生管理系统升级
java·开发语言
弹简特2 小时前
【JavaSE-网络部分03】网络原理-泛泛介绍各个层次
java·开发语言·网络
周杰伦的稻香2 小时前
Hexo搭建教程
java·node.js
倔强的石头1062 小时前
飞算JavaAI如何提升重塑Java开发体验
java·飞算javaai·ai开发工具
努力d小白2 小时前
leetcode438.找到字符串中所有字母异位词
java·javascript·算法