一、概述
任务调度是一个系统中不可缺少的组件,在微服务的实际部署中,为了保证高可用,应用往往会部署至少两个,因此任务调度还必须满足分布式的要求。有好几个流行的分布式调度框架,比如XXL-JOB、Elastic-job、Staturn等,本文章介绍XXL-JOB提供的源码入门程序,主要是入门级别的使用,先跑起来,再集成到微服务中。
二、MySql部署与初始化
2.1 MySql安装
XXL-JOB依赖mysql,为了部署快一点,我采用了Docker方式的部署方式,我安装了DockerDesktop,直接用如下几个命令轻松安装。
# 拉取mysql镜像
docker pull mysql:5.7.42
# 运行mysql,同时暴露3306端口给外部访问
docker run --name microservicedb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.42
注意:这里的mysql一定要暴露端口出去,否则第二步使用工具连接的时候会连接不上,这里采坑了。
2.2 DBeaver使用
听说DBeaver工具好用,于是下载最新版本DBeaver,打开配置连接
通过这个客户端工具,执行XXL-JOB提供的sql脚本,完成数据库的初始化工作。这里也有一个小插曲,这个工具我把sql都拷贝进行后,没法全部一口气执行,于是我一句一句执行脚本,还好脚本不多。需要再研究研究这个工具的使用,这个不是本次的重点。
三、XXL-JOB控制台
3.1 工程结构
下载最新的XXL-JOB源码,用IDE打开,其工程结构如下:
其中xxl-job-admin就是控制台应用程序,依赖于xxl-job-core模块。
3.2 控制台启动
该工程是基于SpringBoot,只要修改下application.properties中的数据库配置即可启动。找到如下配置,修改数据库的相关信息即可。
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
最后,通过XxlJobAdminApplication在IDE中启动这个应用,访问如下地址:
http://localhost:8080/xxl-job-admin
默认用户和密码为admin/123456
至此,控制台搭建完毕。
四、任务调度Demo运行
提供的工程中包含了两个任务调度的参考案例,其中有一个是基于SpringBoot实现。
4.1 SpringBoot集成配置
主要有pom文件依赖,以及Java的配置。
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${project.parent.version}</version>
</dependency>
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.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;
}
4.2 代码实现
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
logger.info("XXL-JOB, Hello World.");
for (int i = 0; i < 5; i++) {
XxlJobHelper.log("beat at:" + i);
logger.info("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
// default success
}
注意,这里的XxlJobHelper的日志打印是在控制台上,不是在程序的控制台上。
4.3 控制台操作
在控制台上,demoJobHandler已经默认配置好了,可以看到如下信息:
这里配置的是每天凌晨0点执行一次。
如果要强制执行一次怎么办呢?可以通过操作手动执行一次,这对测试真是太友好了。
最终可以看到IDE上的控制台信息如下:
执行成功,完美。
五、总结
- XXL-JOB依赖于MySql,需要先搭建好MySql环境。
- 提供的SpringBoot集成案例运行比较方便,很容易集成到基于SpringBoot的程序中。
- 另外还提供了Dockerfile脚本,方便生成镜像,不得不说下真是太贴心了。