springboot项目集成xxl-job定时任务框架
1 定时任务介绍
1.1 什么是定时任务
定时任务时基于给定的时间点、给定的时间间隔或者给定的执行次数自动执行的程序。
任务调度是系统的重要组成部分,同时涉及到多线程并发、运行时间规则定制及解析、线程池的维护等诸多方面的工作。
1.2 应用场景
业务数据同步(线上数据同步到线下,新平台老平台数据的同步),消息通知,业务数据的补偿。
2 xxl-job定时任务
2.1 设计思想
xxl-job是一个轻量级的分布式调度框架,,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

1. 将调度行为抽象形成调度中心平台,其只负责发起调度请求。
2. 将任务抽象成JobHandler,交由执行器统一管理,执行器负责接收调度请求并执行对应的JobHandler中的业务。
3. 调用机制:1) HTTP请求 2) RPC远程调用
无论那种调用方式,首先需要知道执行器的地址ip,端口。所以在执行器中起了一个注册线程。注册线程会向调度中心发送注册请求。调度中心记下后,生成执行器的oline机器地址,方便后期调用执行器。
4. 调度中心调用执行器中的某个具体任务之后,执行器接收到服务之后,进行调度,执行某个具体的方法【JobHandler】,而后将执行结果传给调度中心。
2.2 xxl-job框架的两个核心内容
1. 调度中心
(1) 负责管理调度信息,按照调度配置发出调度请求,本身不承担业务代码。
(2) 调度系统与任务解耦,提高了系统可用性与稳定性,同时调度系统性能不在受限于任务模块。
(3) 支持可视化,简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果及执行日志,支持执行器Failover【故障转移】。
2. 执行器
(1) 负责接受调度请求并执行任务逻辑。
(2) 任务模块专注于任务的执行等操作。
3 springboot集成xxl-job项目实战
3.1 前期准备工作
1 下载源码
源码地址:https://gitee.com/xuxueli0323/xxl-job
2、初始化数据库
(1) IDEA导入下载好的项目。
(2) 初始化数据库,打开数据库,运行项目当中sql脚本文件,生成相应的关系表。

生成的数据库表

注意:
(1)根据需求配置application.properties文件,修改数据库连接的用户名和密码,修改服务端口号,避免端口冲突。
(2)我的服务端口号为8081,启动服务后访问网址:http://localhost:8081/xxl-job-admin/
账户/密码:admin/123456
3.2 项目创建
1 引入核心依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.1</version>
</dependency>
2 根据需要修改application.yml文件中的配置
xxl:
job:
admin:
# 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
addresses: http://localhost:8081/xxl-job-admin
executor:
# 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
address:
# 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
appname: xxl-job-executor-test
# 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
ip:
# 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
port: 9999
# 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
logpath: /data/xxl-job-log/jobhandler
# 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 15
# 执行器通讯TOKEN [选填]:非空时启用;
accessToken: default_token
3 创建配置类
在config目录中新建XxlJobConfig类

package com.springboot.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Strive
* @date 2022/4/19 17:26
* @description
*/
@Slf4j
@Configuration
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() {
log.info("----- 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);
log.info("----- xxl-job config end -----");
return xxlJobSpringExecutor;
}
}
4 编写xxl-job任务
在com.springboot目录下创建一个task包,在task下创建一个 MingYueScheduledTask类编写任务代码。代码中XxlJob注解后续会在调度中心用到,方便执行器找到该任务进行执行。
package com.springboot.task;
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;
/**
* @author Strive
* @date 2022/4/18 16:19
* @description 明月定时任务
*/
@Slf4j
@Component
public class MingYueScheduledTask {
/** 每1分钟扫描一次,扫描发送失败的短信,再次发送 */
@XxlJob("sendErrorMsg")
public ReturnT<String> sendErrorMsg() {
log.info("发送失败的短信,再次发送");
return ReturnT.SUCCESS;
}
}
3.3 配置定时任务
1 配置执行器
AppName要与application.yml文件中的参数appname相同,名称自己设置即可,注册方式建议选择自动注册。启动项目后,调度中心会根据配置文件中的端口号自动生成机器地址。

2 配置具体定时任务
在基础配置中只需要注意执行器设置成之前配好的执行器名称,其他按照自己需求配置就好了;在调度配置中调度类型默认,Corn按自己需求配置,我的是每5秒调度一次执行执行任务;任务配置中的JobHandler要使用注解XxlJob中的value值,必须要一样,否则执行器找不到任务执行;高级配置默认就好了。

3 启动定时任务
定时任务启动之后,调度中心每5秒发送一次调度请求,执行器接收到请求自动去执行业务逻辑,将执行结果主动上交给调度中心。将调度中心和执行器都启动后,可以看到在项目控制台上每5秒打印一次 “发送失败的短信,再次发送”。


魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)