🎉欢迎来到架构设计专栏~Spring Boot集成 Xxl-job 实现超牛的定时任务
- ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
- ✨博客主页:IT·陈寒的博客
- 🎈该系列文章专栏:架构设计
- 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
- 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
- 📜 欢迎大家关注! ❤️
在现代的应用开发中,定时任务是不可或缺的一部分。为了更加高效地管理和监控这些任务,我们通常会使用一些优秀的定时任务调度框架。而 Xxl-job 就是其中一款备受好评的框架,它提供了可视化的任务管理界面、分布式任务调度、执行日志记录等功能。本文将带你一步步实现在 Spring Boot 项目中集成 Xxl-job,打造超牛的定时任务系统。
在选择定时任务框架时,我们需要考虑一些关键因素,而 Xxl-job 恰好满足这些需求:
可视化管理界面:Xxl-job 提供直观、易用的可视化管理界面,让我们能够方便地管理和监控定时任务。
分布式任务调度:对于分布式系统,Xxl-job 提供了强大的分布式任务调度能力,可以轻松地实现任务在集群中的分发和执行。
任务执行日志:Xxl-job 支持任务执行日志的记录和查看,这有助于及时发现和解决任务执行中的问题。
动态添加、删除任务:Xxl-job 允许在运行时动态添加和删除任务,无需停止整个应用。
首先,在 Spring Boot 项目中添加 Xxl-job 的依赖。在 pom.xml 文件中加入以下依赖:
com.xuxueli xxl-job-core 2.3.0
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
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 所需的数据库表,它们将存储任务信息、执行日志等相关数据。
在 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
在 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 ReturnTmyJobHandler(String param) { // 任务逻辑代码 System.out.println("定时任务执行,参数:" + param); return ReturnT.SUCCESS; } }
这个任务类中有一个使用 @XxlJob 注解标记的方法 myJobHandler,该方法就是我们的定时任务逻辑。参数 param 是定时任务的参数。
现在,可以启动 Spring Boot 项目了。当项目启动后,Xxl-job Executor 会自动注册到 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 ReturnTdynamicJobHandler(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外卖订购系统
- 【数据结构学习】从零起步:学习数据结构的完整路径