文章目录

🎉欢迎来到架构设计专栏~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 支持任务执行日志的记录和查看,这有助于及时发现和解决任务执行中的问题。
- 动态添加、删除任务: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.sqlCREATETABLE`xxl_job_qrtz_lock`(`lock_name`varchar(64)COLLATE utf8mb4_unicode_ci NOTNULL,`lock_value`varchar(64)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`lock_grant`varchar(64)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`lock_thread`varchar(255)COLLATE utf8mb4_unicode_ci DEFAULTNULL,PRIMARYKEY(`lock_name`),UNIQUEKEY`idx_lock_name`(`lock_name`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;CREATETABLE`xxl_job_qrtz_triggers`(`trigger_name`varchar(80)COLLATE utf8mb4_unicode_ci NOTNULL,`trigger_group`varchar(80)COLLATE utf8mb4_unicode_ci NOTNULL,`job_name`varchar(80)COLLATE utf8mb4_unicode_ci NOTNULL,`job_group`varchar(80)COLLATE utf8mb4_unicode_ci NOTNULL,`next_fire_time`bigint(13)DEFAULTNULL,`prev_fire_time`bigint(13)DEFAULTNULL,`priority`integer(11)DEFAULTNULL,`trigger_state`varchar(16)COLLATE utf8mb4_unicode_ci NOTNULL,`trigger_type`varchar(8)COLLATE utf8mb4_unicode_ci NOTNULL,`start_time`bigint(13)NOTNULL,`end_time`bigint(13)DEFAULTNULL,`calendar_name`varchar(255)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`misfire_instr`integer(11)DEFAULTNULL,`job_data`blob,PRIMARYKEY(`trigger_name`,`trigger_group`),FOREIGNKEY(`job_name`,`job_group`)REFERENCES`xxl_job
_qrtz_jobs`(`job_name`,`job_group`)ONDELETECASCADE)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;CREATETABLE`xxl_job_qrtz_jobs`(`job_name`varchar(80)COLLATE utf8mb4_unicode_ci NOTNULL,`job_group`varchar(80)COLLATE utf8mb4_unicode_ci NOTNULL,`desc`varchar(100)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`add_time`bigint(13)DEFAULTNULL,`update_time`bigint(13)DEFAULTNULL,`author`varchar(100)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`alarm_email`varchar(100)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`executor_route_strategy`varchar(10)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`executor_handler`varchar(255)COLLATE utf8mb4_unicode_ci NOTNULL,`executor_param`varchar(512)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`executor_block_strategy`varchar(10)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`executor_fail_retry_count`int(11)DEFAULTNULL,`child_jobid`varchar(255)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`trigger_status`varchar(10)COLLATE utf8mb4_unicode_ci DEFAULTNULL,PRIMARYKEY(`job_name`,`job_group`),KEY`idx_qrtz_jobs_group`(`job_group`),FOREIGNKEY(`job_group`)REFERENCES`xxl_job_qrtz_job_groups`(`job_group`)ONDELETECASCADE)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;CREATETABLE`xxl_job_qrtz_job_groups`(`job_group`varchar(80)COLLATE utf8mb4_unicode_ci NOTNULL,`desc`varchar(100)COLLATE utf8mb4_unicode_ci DEFAULTNULL,`add_time`bigint(13)DEFAULTNULL,`update_time`bigint(13)DEFAULTNULL,`author`varchar(100)COLLATE utf8mb4_unicode_ci DEFAULTNULL,PRIMARYKEY(`job_group`))ENGINE=InnoDBDEFAULTCHARSET=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
接口:
importcom.xxl.job.core.biz.model.ReturnT;importcom.xxl.job.core.handler.annotation.XxlJob;importorg.springframework.stereotype.Component;@ComponentpublicclassMyJobHandler{@XxlJob("myJobHandler")publicReturnT<String>myJobHandler(String param){// 任务逻辑代码System.out.println("定时任务执行,参数:"+ param);returnReturnT.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 添加任务:
importcom.xxl.job.core.biz.model.ReturnT;importcom.xxl.job.core.handler.annotation.XxlJob;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;@ComponentpublicclassDynamicJobHandler{@AutowiredprivateXxlJobService xxlJobService;@XxlJob("dynamicJobHandler")publicReturnT<String>dynamicJobHandler(String param){// 任务逻辑代码System.out.println("动态定时任务执行,参数:"+ param);returnReturnT.SUCCESS;}// 动态添加任务publicvoidaddDynamicJob(){XxlJobInfo jobInfo =newXxlJobInfo```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());}}// 动态删除任务publicvoidremoveDynamicJob(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 的易用性和强大功能,相信它会是你定时任务的不二之选。
🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:
- 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
- 【Java学习路线】2023年完整版Java学习路线图
- 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
- 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
- 【数据结构学习】从零起步:学习数据结构的完整路径
版权归原作者 IT·陈寒 所有, 如有侵权,请联系我们删除。
