Spring Boot集成 Xxl-job 实现超牛的定时任务
作者:mmseoamin日期:2023-12-11

文章目录

    • 为什么选择 Xxl-job?
    • 开始集成 Xxl-job
      • 步骤 1:添加依赖
      • 步骤 2:配置数据源
      • 步骤 3:初始化数据库表
      • 步骤 4:配置 Xxl-job
      • 步骤 5:编写定时任务
      • 步骤 6:启动项目
      • 步骤 7:访问 Xxl-job Admin
      • 拓展:动态添加、删除任务
      • 总结

        Spring Boot集成 Xxl-job 实现超牛的定时任务,在这里插入图片描述,第1张

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


        • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
        • ✨博客主页:IT·陈寒的博客
        • 🎈该系列文章专栏:架构设计
        • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
        • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
        • 📜 欢迎大家关注! ❤️

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

        Spring Boot集成 Xxl-job 实现超牛的定时任务,在这里插入图片描述,第2张

        为什么选择 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 文件中加入以下依赖:

        
            com.xuxueli
            xxl-job-core
            2.3.0
        
        

        步骤 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 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 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 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 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 的易用性和强大功能,相信它会是你定时任务的不二之选。


          🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏

          📜您可能感兴趣的内容:

          • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
          • 【Java学习路线】2023年完整版Java学习路线图
          • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
          • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
          • 【数据结构学习】从零起步:学习数据结构的完整路径

            Spring Boot集成 Xxl-job 实现超牛的定时任务,在这里插入图片描述,第3张