一、xxl-job简介
xxl-job是一个开源的分布式定时任务框架,它可以与其他微服务组件一起构成微服务集群。它的调度中心(xxl-job)和执行器(自己的springboot项目中有@XxlJob("定时任务名称")的方法)是相互分离,分开部署的,两者通过HTTP协议进行通信。
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
调度模块(调度中心):
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
执行模块(执行器):
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;接收“调度中心”的执行请求、终止请求和日志请求等。
Xxl-job项目地址: GitHub地址:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB) Gitee地址:xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
Xxl-job优点:
View Code
二、Xxl-job使用
2.1. 下载项目
通过上面地址下载项目源码,用IDEA打开项目,配置好Maven,并刷新Maven加载项目相关依赖。
2.2. Install项目
我们把项目install成maven依赖到本地maven仓库。防止后期我们把xxl-job-admin拿出来单独导入IDEA时,使用xxl-job-core这依赖时报错,因为阿里maven库是没有这个包的,要自己install一下。
2.3 xxl-job-admin构建
xxl-job-admin 本身就是一个 springboot 项目,将 xxl-job-admin 这个子项目从源代码中复制出来,使用 idea 打开,配置好 Maven,刷新Maven导入依赖(xxl-job-core等。上面执行 install 步骤后,这里刷新Maven就不会报错)。这个就是我们的定时任务管理器(调度中心),将项目中 application.properties 配置文件中的 server.port 改一个非8080的不常用的端口,然后将数据库连接信息改成 xxl-job 的实际数据库连接地址。然后将xxl-job-admin项目打成jar包,执行命令 java -jar xxl-job-admin-2.4.0-SNAPSHOT.jar 独立于自己的真实业务项目运行。线上环境 将数据库连接地址改为真实服务器地址、用户名、密码,再将 xxl-job-admin-2.4.0-SNAPSHOT.jar 放到线上环境执行即可。
【 创建xxl-job-admin数据库 -- 修改配置文件 -- 构建 xxl-job-admin -- 启动xxl-job-admin项目 -- 访问xxl-job-admin 】
将xxl-job-admin-2.4.0-SNAPSHOT.jar 放到D盘,打开cmd在该目录执行java -jar xxl-job-admin-2.4.0-SNAPSHOT.jar ,启动xxl-job。
在浏览器访问 http://localhost:9090/xxl-job-admin ,用户名admin 密码123456
登录成功,此时没有任务运行。定时任务管理器已经运行成功,我们开始集成到自己的项目。
三、将xxl-job集成到我们的springboot项目
3.1 引入Maven依赖
<!-- SpringBoot集成Xxl-Job -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
3.2.编写配置文件
在我们的springboot项目的 application-dev.yml 配置文件中新增xxl-job配置信息。注意:如果 accessToken 不设置的话,最好把它注释掉,或者 输入xxl-job 默认的 default_token ,否则调用的时候容易引起获取不到token的报错。
# Xxl-Job分布式定时任务调度中心
xxl:
job:
admin:
# 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。
addresses: http://localhost:9090/xxl-job-admin
# addresses: http://192.168.110.2:9090/xxl-job-admin
# 执行器通讯TOKEN [选填]:非空时启用 系统默认 default_token
accessToken: default_token
executor:
# 执行器的应用名称
appname: mls-xxl-job
# 执行器注册 [选填]:优先使用该配置作为注册地址
address: ""
# 执行器IP [选填]:默认为空表示自动获取IP
ip: ""
# 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999
port: 9999
# 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
logpath: D:\Codes\logs #logpath: /data/logs/mls/job
# 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 7
3.3 编写配置类
将 XxlJobConfig 配置类放入项目中的配置类文件夹下,此类可以不用修改。注意:如果上一个配置import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName: XxlJobConfig
* @Description: xxl-job依赖配置
* @author:
* @date: 2022年12月07日 08:37
* @version: 1.0
*/
@Configuration //是否开启xxl-job定时任务,注释掉 //@Configuration 则不开启定时任务
@Data
@Slf4j
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobHelper.log(">>>>>>>>>>> xxl-job config init.>>>>>>>>>>>");
System.out.println("=============== xxl-job config init.===============");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
3.4 编写测试类
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @ClassName: XxlJobTest
* @Description: XxlJobTest
* @author:
* @date: 2022年12月07日 12:58
* @version: 1.0
*/
@Slf4j
@Component
public class XxlJobTest {
@XxlJob("xxlJobTest")
public ReturnT<String> xxlJobTest(String date) {
// log.info("---------xxlJobTest定时任务执行成功--------");
System.out.println("---------xxlJobTest定时任务执行成功--------");
return ReturnT.SUCCESS;
}
}
3.5 启动项目
先启动调度中心(xxl-job-admin模块),再启动自己的springBoot服务(xxl-job-admin模块的端口已改为9090,所以本地在浏览器访问 http://localhost:9090/xxl-job-admin ,用户名admin 密码123456
3.6 任务调度中心,配置服务
3.6.1 执行器管理--新增执行器
3.6.2 任务管理--新增任务
3.6.3 任务管理--执行任务
测试可以点击“执行一次”,如果想一直运行,点击下拉的“启动”即可。至此,springboot 简单集成 xxl-job 已完成。