在现代的应用开发中,定时任务是不可或缺的一部分。为了更加高效地管理和监控这些任务,我们通常会使用一些优秀的定时任务调度框架。而 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.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 的易用性和强大功能,相信它会是你定时任务的不二之选。
来源:ithan.blog.csdn.net/article/details/134324578
后端专属技术群 构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!
文明发言,以
交流技术
、职位内推
、行业探讨
为主广告人士勿入,切勿轻信私聊,防止被骗
原文始发于微信公众号(Java笔记虾):SpringBoot + xxl-job 实现一个超牛的定时任务系统!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/196715.html