在传统的调度任务中,随着系统复杂的增加,往往会无法满足高效、可靠、可扩展的系统需求。XXL-JOB正是这样一款可以在分布式场景下调度任务、支持通过简单高效的方式来创建、管理分配任务的分布式任务调度平台。XXL-JOB的设计简单易用,并且能够与现有系统实现高效快速的集成,还支持了各种的业务场景需求,并且是在一些中小型企业项目中的到了广泛的使用。
下面我们就来介绍如何在Spring Boot中整合XXL-JOB。
搭建XXL-JOB调度中心(Admin)
这里我们可以通过Docker来搭建一个XXL-JOB Admin服务。如下所示。
docker run -d -p 8080:8080 --name xxl-job-admin --restart always \
-e XXL_JOB_ADMIN_WEB_PORT=8080 \
-e XXL_JOB_ADMIN_ADDRESS=http://127.0.0.1:8080 \
--link mysql:mysql \
xuxueli/xxl-job-admin
这样我们就可以启动了一个XXL-JOB Admin 服务,并监听在本地8080端口。我们可以通过http://localhost:8080访问调度中心。
在XXL-JOB Admin中我们需要对人物调度数据进行持久化的存储,所以需要连接MySQL数据并且在数据库中添加对应的表结构。
CREATE DATABASE xxl_job;
通过执行xxl-job-admin项目中的SQL脚本来初始化数据库,这个脚本我们可以从XXL-JOB GitHub 仓库中得到,或者是通过Docker启动项目的时候这个数据库会自动创建。
添加依赖
接下来,我们就可以在项目的POM文件中添加XXL-JOB的依赖配置,如下所示。
org.springframework.boot
spring-boot-starter-web
com.xxl.job
xxl-job-core
2.3.0
org.springframework.boot
spring-boot-starter-logging
然后接下来就是在Spring Boot项目的配置文件中添加与XXL-JOB服务的连接配置信息,如下所实施。
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin # 调度中心地址
xxl.job.executor.appname=xxl-job-executor-springboot # 执行器名称
xxl.job.executor.ip=127.0.0.1 # 执行器的IP
xxl.job.executor.port=9999 # 执行器端口
xxl.job.executor.logpath=/data/applogs/xxl-job # 执行日志路径
xxl.job.executor.logretentiondays=30 # 日志保留天数
XXL-JOB类配置
根据上面的配置项的内容,我们需要创建对应的配置类。
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String executorIp;
@Value("${xxl.job.executor.port}")
private int executorPort;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appName);
xxlJobSpringExecutor.setIp(executorIp);
xxlJobSpringExecutor.setPort(executorPort);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
编写执行器类
配置完成之后,我们就可以通过@XxlJob 注解来标识一个任务执行器的类,如下所示。
@Component
public class MyJobHandler {
@XxlJob("simpleJobHandler")
public void simpleJobHandler() throws Exception {
System.out.println("XXL-JOB 任务执行中...");
// 模拟任务执行逻辑
Thread.sleep(2000);
System.out.println("任务执行完毕");
}
}
在上面的代码中simpleJobHandler是任务的名称,调度中心会根据这个名称来调度任务。而@XxlJob注解则是用来标识这个方法为需要调用的任务执行方法。
配置任务调度
我们可以在调度配置中心,创建一个调度任务操作,然后可以配置好任务执行的周期以及任务执行的条件,或者是我们在需要的时候可以通过手动的方式来触发定时任务操作。
总结
到这里,我们就完成了Spring Boot应用和XXL-JOB执行器的集成,通过XXL-JOB可以轻松实现分布式任务调度,管理和执行任务。在实际场景中,我们可以根据业务需求来对XXL-JOB操作进行进一步的扩展和优化。