文章目录
-
- [为什么选择 Xxl-job?](#为什么选择 Xxl-job? "#_Xxljob_19")
- [开始集成 Xxl-job](#开始集成 Xxl-job "#_Xxljob_31")
-
- [步骤 1:添加依赖](#步骤 1:添加依赖 "#_1_33")
- [步骤 2:配置数据源](#步骤 2:配置数据源 "#_2_45")
- [步骤 3:初始化数据库表](#步骤 3:初始化数据库表 "#_3_57")
- [步骤 4:配置 Xxl-job](#步骤 4:配置 Xxl-job "#_4_Xxljob_126")
- [步骤 5:编写定时任务](#步骤 5:编写定时任务 "#_5_151")
- [步骤 6:启动项目](#步骤 6:启动项目 "#_6_174")
- [步骤 7:访问 Xxl-job Admin](#步骤 7:访问 Xxl-job Admin "#_7_Xxljob_Admin_178")
- 拓展:动态添加、删除任务
- 总结
🎉欢迎来到架构设计专栏~Spring Boot集成 Xxl-job 实现超牛的定时任务
在现代的应用开发中,定时任务是不可或缺的一部分。为了更加高效地管理和监控这些任务,我们通常会使用一些优秀的定时任务调度框架。而 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
文件中加入以下依赖:
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
)文件中添加数据库配置:
properties
# 数据库配置
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
的文件,内容如下:
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 的相关配置:
properties
# 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
接口:
java
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 添加任务:
java
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 的易用性和强大功能,相信它会是你定时任务的不二之选。
🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏\