1 xxl-job简述
在当今的软件开发领域,分布式任务调度是一个重要的课题。xxl-job 作为一个分布式任务调度平台,以其开发迅速、学习简单、轻量级、易扩展等特点,受到了众多开发者的青睐。
2 xxl-job安装与使用
2.1 安装
首先,需要从官网下载代码。
需要注意的是,版本3.x
开始要求Jdk17
;版本2.x
及以下支持Jdk1.8
。如对Jdk版本有诉求,可选择接入不同版本。我这里下载了基于jdk8
的最后的版本2.5.0
。
下载后在 idea 中打开,会看到如下目录结构:
doc
:包含文档资料,以及“调度数据库”建表脚本。xxl-job-core
:公共 jar 依赖。xxl-job-admin
:调度中心,是一个 spring boot 项目,可以直接启动。xxl-job-executor-samples
:执行器,是 sample 示例项目,其中的 spring boot 工程也可直接启动,开发者可以在此项目上进行开发,或者将现有项目改造成执行器项目。
下载代码后,还需要进行以下操作才能正常启动:
第一步,从 doc 文件夹中获取 SQL 脚本,并将其放到自己的 MySQL 数据库中执行 SQL 语句。执行完 SQL 脚本后,数据库中会生成相应的表。
第二步,在 admin 模块中修改 applicant.properties 配置文件,可根据需要修改启动端口号,同时必须修改数据库配置。
2.2 启动
直接启动 xxl-job-admin
模块。启动成功后,在浏览器端访问 web 页面 URL(注意端口号是自己设置的),例如:http://127.0.0.1:8089/xxl-job-admin/
。登录进去后会看到相应的页面。
使用默认用户名和密码登录xxl-job的管理平台:
xxl-job管理平台首页:
这里先不详细讲解操作步骤,在后续 SpringBoot 和 xxl-job 整合后再进行详细介绍。完成这一步,说明 xxl-job 的准备工作已就绪,接下来就可以与 SpringBoot 进行整合了。
3 SpringBoot整合xxl-job实现定时任务
- 项目仓库(GitHub):https://github.com/itwanger/paicoding
- 项目仓库(码云):https://gitee.com/itwanger/paicoding
- 分支:
origin/feature/xxl_job_20230605
3.1 引入xxl-job依赖
在项目paicoding-core/pom.xml
中引入 xxl-job 的相关依赖,为后续整合做好准备。
<!-- 引入xxl_job定时任务 -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
3.2 yml配置文件中配置xxl-job配置
在 paicoding-web/src/main/resources-env/dev/application-dal.yml
配置文件中进行 xxl-job
的配置,配置文件中的注释已经对各个功能进行了详细介绍,开发者需仔细查看注释。
# Xxl-Job分布式定时任务调度中心
xxl:
job:
admin:
# 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。
addresses: http://127.0.0.1:8089/xxl-job-admin
# addresses: http://192.168.110.2:9090/xxl-job-admin
# 执行器通讯TOKEN [选填]:非空时启用 系统默认 default_token
accessToken: default_token
executor:
# 执行器的应用名称
appname: pai-coding
# 执行器注册 [选填]:优先使用该配置作为注册地址
address: ""
# 执行器IP [选填]:默认为空表示自动获取IP
ip: ""
# 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999
port: 9998
# 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
logpath:
#logpath: /data/logs/mls/job
# 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 7
需要注意的是,address
属性中的端口号一定要与上面 xxl-job admin
模块中的配置 server.port
相对应。
3.3 编写xxl-job的config配置文件
按照要求编写 xxl-job 的 config 配置文件,确保配置的正确性。
具体代码位置:com.github.paicoding.forum.core.config.XxlJobConfig
/**
* 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.>>>>>>>>>>>");
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);
return xxlJobSpringExecutor;
}
}
3.4 代码编辑执行任务
在要执行的定时任务方法上添加 @XxlJob()
注解,表明该方法需要被执行。
/**
* 采用定时器方案,每天5:15分刷新站点地图,确保数据的一致性
*/
@XxlJob("autoRefreshCache")
public void autoRefreshCache() {
log.info("开始刷新sitemap.xml的url地址,避免出现数据不一致问题!");
refreshSitemap();
log.info("刷新完成!");
}
完成 SpringBoot 代码编写后,启动该项目。
3.5 在xxl-job任务调度中心中添加执行器
注意,要先添加执行器,然后再启动项目。启动项目(执行器)后,等待一会儿(给项目注册进 xxl-job 一些时间),刷新网页,就可以看到执行器成功注册。
点击 onLine 机器地址对应的查看后,可以看到执行器地址。
3.6 在xxl-job任务调度中心中添加任务管理
添加任务管理并保存后,就可以看到该任务。将任务的 stop 状态设置为启动状态。
3.7 测试xxl-job
点击“执行一次”,项目中对应的定时任务就会执行,若能正常执行,说明整合成功。
控制台打印如下log,表示任务执行成功。
3.8 xxl-job日志查看
可以在相关界面查看 xxl-job 的日志,同时,查询总的日志可以在菜单—运行报表中进行查看。
4 总结
通过以上详细的步骤,我们完成了使用 xxl-job 实现定时任务以及与 SpringBoot 的整合。xxl-job 凭借其出色的性能、可靠性和便捷的运维管理,为分布式任务调度提供了优秀的解决方案。希望这篇教程能够帮助开发者快速上手 xxl-job,在实际项目中发挥其强大的功能。当然,在使用过程中可能还会遇到各种问题,大家可以参考官方文档和社区讨论来解决。