Spring Boot集成 Xxl-job 实现超牛的定时任务


在这里插入图片描述

🎉欢迎来到架构设计专栏~Spring Boot集成 Xxl-job 实现超牛的定时任务



在现代的应用开发中,定时任务是不可或缺的一部分。为了更加高效地管理和监控这些任务,我们通常会使用一些优秀的定时任务调度框架。而 Xxl-job 就是其中一款备受好评的框架,它提供了可视化的任务管理界面、分布式任务调度、执行日志记录等功能。本文将带你一步步实现在 Spring Boot 项目中集成 Xxl-job,打造超牛的定时任务系统。
在这里插入图片描述

为什么选择 Xxl-job?

在选择定时任务框架时,我们需要考虑一些关键因素,而 Xxl-job 恰好满足这些需求:

  1. 可视化管理界面:Xxl-job 提供直观、易用的可视化管理界面,让我们能够方便地管理和监控定时任务。

  2. 分布式任务调度:对于分布式系统,Xxl-job 提供了强大的分布式任务调度能力,可以轻松地实现任务在集群中的分发和执行。

  3. 任务执行日志:Xxl-job 支持任务执行日志的记录和查看,这有助于及时发现和解决任务执行中的问题。

  4. 动态添加、删除任务:Xxl-job 允许在运行时动态添加和删除任务,无需停止整个应用。

开始集成 Xxl-job

步骤 1:添加依赖

首先,在 Spring Boot 项目中添加 Xxl-job 的依赖。在 pom.xml 文件中加入以下依赖:

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.0</version>
</dependency>

步骤 2:配置数据源

Xxl-job 需要使用数据库来存储任务信息和执行日志。在 Spring Boot 项目的 application.properties(或 application.yml)文件中添加数据库配置:

# 数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
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

步骤 3:初始化数据库表

Xxl-job 提供了一个初始化脚本,用于创建必要的数据库表。在 resources 目录下创建一个名为 xxl-job.sql 的文件,内容如下:

-- xxl-job.sql

CREATE TABLE `xxl_job_qrtz_lock` (
  `lock_name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
  `lock_value` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `lock_grant` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `lock_thread` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`lock_name`),
  UNIQUE KEY `idx_lock_name` (`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `xxl_job_qrtz_triggers` (
  `trigger_name` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL,
  `trigger_group` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL,
  `job_name` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL,
  `job_group` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL,
  `next_fire_time` bigint(13) DEFAULT NULL,
  `prev_fire_time` bigint(13) DEFAULT NULL,
  `priority` integer(11) DEFAULT NULL,
  `trigger_state` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
  `trigger_type` varchar(8) COLLATE utf8mb4_unicode_ci NOT NULL,
  `start_time` bigint(13) NOT NULL,
  `end_time` bigint(13) DEFAULT NULL,
  `calendar_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `misfire_instr` integer(11) DEFAULT NULL,
  `job_data` blob,
  PRIMARY KEY (`trigger_name`,`trigger_group`),
  FOREIGN KEY (`job_name`,`job_group`) REFERENCES `xxl_job

_qrtz_jobs` (`job_name`,`job_group`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `xxl_job_qrtz_jobs` (
  `job_name` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL,
  `job_group` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL,
  `desc` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `add_time` bigint(13) DEFAULT NULL,
  `update_time` bigint(13) DEFAULT NULL,
  `author` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `alarm_email` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `executor_route_strategy` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `executor_handler` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `executor_param` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `executor_block_strategy` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `executor_fail_retry_count` int(11) DEFAULT NULL,
  `child_jobid` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `trigger_status` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`job_name`,`job_group`),
  KEY `idx_qrtz_jobs_group` (`job_group`),
  FOREIGN KEY (`job_group`) REFERENCES `xxl_job_qrtz_job_groups` (`job_group`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `xxl_job_qrtz_job_groups` (
  `job_group` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL,
  `desc` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `add_time` bigint(13) DEFAULT NULL,
  `update_time` bigint(13) DEFAULT NULL,
  `author` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`job_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

这是 Xxl-job 所需的数据库表,它们将存储任务信息、执行日志等相关数据。

步骤 4:配置 Xxl-job

在 Spring Boot 项目的 application.properties(或 application.yml)文件中添加 Xxl-job 的相关配置:

# xxl-job配置
xxl.job.admin.addresses=http://localhost:8080/xxl-job-admin
xxl.job.accessToken=
xxl.job.executor.appname=your-app-name
xxl.job.executor.address=http://localhost:8080/xxl-job-executor
xxl.job.executor.ip=
xxl.job.executor.port=0
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=3
  • xxl.job.admin.addresses:Xxl-job Admin 的访问地址,用于管理任务。
  • xxl.job.accessToken:Xxl-job Executor 的访问令牌,用于简单的身份验证。
  • xxl.job.executor.appname:执行器名称,用于区分不同的执行器。
  • xxl.job.executor.address:执行器的地址,通常为当前项目的地址。
  • xxl.job.executor.ip:执行器 IP 地址,为空时自动获取本机 IP。
  • xxl.job.executor.port:执行器端口,0 表示随机端口。
  • xxl.job.executor.logpath:执行器日志路径。
  • xxl.job.executor.logretentiondays:执行器日志保留天数。

步骤 5:编写定时任务

在 Spring Boot 项目中,我们需要创建定时任务的执行逻辑。首先,创建一个任务类,实现 IJobHandler 接口:

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

@Component
public class MyJobHandler {

    @XxlJob("myJobHandler")
    public ReturnT<String> myJobHandler(String param) {
        // 任务逻辑代码
        System.out.println("定时任务执行,参数:" + param);
        return ReturnT.SUCCESS;
    }
}

这个任务类中有一个使用 @XxlJob 注解标记的方法 myJobHandler,该方法就是我们的定时任务逻辑。参数 param 是定时任务的参数。

步骤 6:启动项目

现在,可以启动 Spring Boot 项目了。当项目启动后,Xxl-job Executor 会自动注册到 Admin 中,并且定时任务将在规定的时间执行。

步骤 7:访问 Xxl-job Admin

打开浏览器,访问 Xxl-job Admin 的地址(默认为 http://localhost:8080/xxl-job-admin)。在界面上,你将看到一个清晰的任务管理界面,可以在这里添加、编辑和监控任务。

拓展:动态添加、删除任务

Xxl-job 提供了 API,允许在运行时动态添加和删除任务。在实际应用中,我们可能需要根据业务需要动态调整任务,而无需停止整个应用。

以下是一个简单的例子,演示如何使用 Xxl-job 的 API 添加任务:

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class DynamicJobHandler {

    @Autowired
    private XxlJobService xxlJobService;

    @XxlJob("dynamicJobHandler")
    public ReturnT<String> dynamicJobHandler(String param) {
        // 任务逻辑代码
        System.out.println("动态定时任务执行,参数:" + param);
        return ReturnT.SUCCESS;
    }

    // 动态添加任务
    public void addDynamicJob() {
        XxlJobInfo jobInfo = new XxlJobInfo```java
        .setJobGroup("YOUR_JOB_GROUP")
        .setJobDesc("动态任务示例")
        .setExecutorRouteStrategy(ExecutorRouteStrategyEnum.FIRST.name())
        .setExecutorHandler("dynamicJobHandler")
        .setExecutorParam("参数")
        .setExecutorBlockStrategy(ExecutorBlockStrategyEnum.SERIAL_EXECUTION.name())
        .setExecutorFailRetryCount(3);

    ReturnT<String> addResult = xxlJobService.addJob(jobInfo);
    if (addResult.getCode() == ReturnT.SUCCESS_CODE) {
        System.out.println("动态任务添加成功,JobId:" + addResult.getContent());
    } else {
        System.out.println("动态任务添加失败,错误信息:" + addResult.getMsg());
    }
}

// 动态删除任务
public void removeDynamicJob(int jobId) {
    ReturnT<String> removeResult = xxlJobService.removeJob(jobId);
    if (removeResult.getCode() == ReturnT.SUCCESS_CODE) {
        System.out.println("动态任务删除成功");
    } else {
        System.out.println("动态任务删除失败,错误信息:" + removeResult.getMsg());
    }
}

在这个例子中,我们创建了一个 DynamicJobHandler 类,其中包含一个动态任务 dynamicJobHandler。通过调用 xxlJobService.addJob 方法,我们可以动态添加任务。同样,通过调用 xxlJobService.removeJob 方法,可以动态删除任务。这样,我们就可以在应用运行过程中根据需要灵活地管理任务。

总结

通过本文的介绍,你学到了如何在 Spring Boot 项目中集成 Xxl-job,并实现超牛的定时任务。Xxl-job 提供了丰富的功能和可视化的管理界面,使得定时任务的开发和管理变得更加轻松。动态添加和删除任务的能力也为我们提供了更大的灵活性。

希望本文对你了解和使用 Xxl-job 有所帮助。定时任务是每个应用都可能涉及的重要组成部分,选择一款适合自己项目的定时任务框架是非常重要的。综合考虑 Xxl-job 的易用性和强大功能,相信它会是你定时任务的不二之选。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

在这里插入图片描述

posted @ 2023-11-10 23:19  IT·陈寒  阅读(153)  评论(0编辑  收藏  举报  来源