springboot项目集成xxl-job
一、xxl-job简介
xxl-job是一个开源的分布式定时任务框架,它可以与其他微服务组件一起构成微服务集群。它的调度中心(xxl-job)和执行器(自己的springboot项目中有@XxlJob("定时任务名称")的方法)是相互分离,分开部署的,两者通过HTTP协议进行通信。
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
调度模块(调度中心):
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
执行模块(执行器):
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;接收“调度中心”的执行请求、终止请求和日志请求等。
Xxl-job项目地址:
GitHub地址:https://github.com/xuxueli/xxl-job
Gitee地址:https://gitee.com/xuxueli0323/xxl-job
Xxl-job优点:
1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
4、执行器HA(分布式):任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA;
5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
6、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
7、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;
8、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试;
9、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式;
10、任务进度监控:支持实时监控任务进度;
11、Rolling实时日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志;
12、自定义任务参数:支持在线配置调度任务入参,即时生效;
13、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
14、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
二、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 已完成。