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

相关推荐
葡萄成熟时 !8 小时前
JAVA 常用API学习笔记
java·笔记·学习
Rain的Java大神之路8 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
吴声子夜歌9 小时前
Java面试题——基础(一)
java·开发语言
南城以南溫暖如初14710 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
傻啦嘿哟10 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
码匠许师傅11 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
mqiqe12 小时前
AgentScope Java 2.0 Agent 状态存储(AgentStateStore)深度解析:构建可恢复、可扩展的智能体运行时
java·运维·网络
zhifou12345612 小时前
java 17升级安装
java·开发语言
用户37215742613512 小时前
如何使用 Java 将 Markdown 转换为 PDF(含自定义设置)
java
用户37215742613513 小时前
如何使用 Java 在 Word 文档中添加和删除水印:分步指南
java