微服务-分布式任务调度XXL-JOB学习

503 阅读3分钟

一、概述

任务调度是一个系统中不可缺少的组件,在微服务的实际部署中,为了保证高可用,应用往往会部署至少两个,因此任务调度还必须满足分布式的要求。有好几个流行的分布式调度框架,比如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,打开配置连接

image.png

image.png

通过这个客户端工具,执行XXL-JOB提供的sql脚本,完成数据库的初始化工作。这里也有一个小插曲,这个工具我把sql都拷贝进行后,没法全部一口气执行,于是我一句一句执行脚本,还好脚本不多。需要再研究研究这个工具的使用,这个不是本次的重点。

三、XXL-JOB控制台

3.1 工程结构

下载最新的XXL-JOB源码,用IDE打开,其工程结构如下:

image.png

其中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

image.png 至此,控制台搭建完毕。

四、任务调度Demo运行

提供的工程中包含了两个任务调度的参考案例,其中有一个是基于SpringBoot实现。 image.png

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已经默认配置好了,可以看到如下信息: image.png 这里配置的是每天凌晨0点执行一次。 如果要强制执行一次怎么办呢?可以通过操作手动执行一次,这对测试真是太友好了。

image.png

最终可以看到IDE上的控制台信息如下:

image.png

执行成功,完美。

五、总结

  • XXL-JOB依赖于MySql,需要先搭建好MySql环境。
  • 提供的SpringBoot集成案例运行比较方便,很容易集成到基于SpringBoot的程序中。
  • 另外还提供了Dockerfile脚本,方便生成镜像,不得不说下真是太贴心了。