参考:XXL-JOB 官方文档

一、架构设计

1.1 设计思想

将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。

将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。

因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;

1.2 系统组成

  • 调度模块(调度中心): 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
  • 执行模块(执行器): 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等。

1.3 架构图

XXL-JOB 实现分布式任务调度 - 图1

二、快速入门

2.1 部署调度中心

调度中心项目:xxl-job-admin

作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。

部署方案:
测试环境可以使用1个调度中心 + 1个 mysql 服务,生产环境建议使用2个调度中心 + mysql 主从服务,保证高可用。

环境准备:
Jdk1.8,Maven、mysql。

部署步骤如下:

(1) 下载源码

  1. $ git clone https://gitee.com/xuxueli0323/xxl-job
  2. #源码结构如下:
  3. xxl-job-admin:调度中心
  4. xxl-job-core:公共依赖
  5. xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
  6. xxl-job-executor-sample-springbootSpringboot版本,通过Springboot管理执行器,推荐这种方式;
  7. xxl-job-executor-sample-frameless:无框架版本

(2) 执行调度中心数据库初始化 SQL 脚本:

  1. /xxl-job/doc/db/tables_xxl_job.sql

(3) 修改调度中心的配置文件

  • 调度中心配置文件地址:

    1. /xxl-job/xxl-job-admin/src/main/resources/application.properties
  • 调度中心配置内容说明: ```javascript

    调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致

    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=root_pwd spring.datasource.driver-class-name=com.mysql.jdbc.Driver

报警邮箱

spring.mail.host=smtp.qq.com spring.mail.port=25 spring.mail.username=xxx@qq.com spring.mail.password=xxx spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

调度中心通讯TOKEN [选填]:非空时启用;

xxl.job.accessToken=

调度中心国际化配置 [必填]: 默认为 “zh_CN”/中文简体, 可选范围为 “zh_CN”/中文简体, “zh_TC”/中文繁体 and “en”/英文;

xxl.job.i18n=zh_CN

调度线程池最大线程配置【必填】

xxl.job.triggerpool.fast.max=200 xxl.job.triggerpool.slow.max=100

调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;

xxl.job.logretentiondays=30

  1. <a name="foluV"></a>
  2. #### (4) 编译源码
  3. 可以将源码导入 IDE,使用 maven 进行编译,或者使用命令编译:
  4. ```shell
  5. $ cd ~/xxl-job
  6. $ mvn clean package

(5) 部署项目

通过 IDE 启动 SpringBoot 项目,或者如下命令启动:

  1. # 创建部署目录
  2. $ mkdir -p /xxl-job
  3. $ cd ~/xxl-job/xxl-job-admin/target/
  4. $ cp ~/xxl-job/xxl-job-admin/target/xxl-job-admin-2.3.0.jar /xxl-job/xxl-job-admin-2.3.0.jar
  5. #启动
  6. $ nohup java -jar /xxl-job/xxl-job-admin-2.0.1.jar > /dev/null >& 1 &
  7. #检查 admin 123456
  8. $ curl http://localhost:8080/xxl-job-admin

访问调度中心地址:http://localhost:8080/xxl-job-admin
默认登录账号 “admin/123456”, 登录后运行界面如下图所示。
XXL-JOB 实现分布式任务调度 - 图2

(6) Docker 方式搭建调度中心(可选)

  1. # 下载镜像
  2. // Docker地址:https://hub.docker.com/r/xuxueli/xxl-job-admin/ (建议指定版本号)
  3. $ docker pull xuxueli/xxl-job-admin
  4. #创建容器并运行
  5. $ docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:{指定版本}
  6. /**
  7. * 如需自定义 mysql 等配置,可通过 "-e PARAMS" 指定,参数格式 PARAMS="--key=value --key2=value2" ;
  8. * 配置项参考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties
  9. * 如需自定义 JVM内存参数 等配置,可通过 "-e JAVA_OPTS" 指定,参数格式 JAVA_OPTS="-Xmx512m" ;
  10. */
  11. $ docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:{指定版本}

2.2 业务系统(执行器项目)对接

业务系统对接调度中心,需要根据当前项目的框架进行配置,可以参考源码 xxl-job-executor-samples 下例子,下面以业务系统基于 spring boot 框架进行集成。

执行器项目:xxl-job-executor-sample-springboot

作用:负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。

配置部署执行器:

(1) maven 依赖

确认 pom 文件中引入了 xxl-job-core 的 maven 依赖:

  1. <!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
  2. <dependency>
  3. <groupId>com.xuxueli</groupId>
  4. <artifactId>xxl-job-core</artifactId>
  5. <version>${最新稳定版本}</version>
  6. </dependency>

(2) 执行器配置文件

配置文件地址:

  1. /xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

配置内容说明:

  1. ### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册""任务结果回调";为空则关闭自动注册;
  2. xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
  3. ### 执行器通讯TOKEN [选填]:非空时启用;
  4. xxl.job.accessToken=
  5. ### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
  6. xxl.job.executor.appname=xxl-job-executor-sample
  7. ### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 IP:PORT 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
  8. xxl.job.executor.address=
  9. ### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" "调度中心请求并触发任务"
  10. xxl.job.executor.ip=
  11. ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
  12. xxl.job.executor.port=9999
  13. ### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
  14. xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
  15. ### 执行器日志文件保存天数 [选填] 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
  16. xxl.job.executor.logretentiondays=30

(3) 执行器组件配置类

配置类加载配置文件,配置类路径:

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java

主要内容:

@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
    logger.info(">>>>>>>>>>> xxl-job config init.");
    XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
    xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
    xxlJobSpringExecutor.setAppname(appname);
    xxlJobSpringExecutor.setIp(ip);
    xxlJobSpringExecutor.setPort(port);
    xxlJobSpringExecutor.setAccessToken(accessToken);
    xxlJobSpringExecutor.setLogPath(logPath);
    xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

    return xxlJobSpringExecutor;
}

(4) 部署执行器项目

如果已经正确进行上述配置,可将执行器项目编译打部署,系统提供多种执行器 Sample 示例项目,选择其中一个即可,各自的部署方式如下。

xxl-job-executor-sample-springboot: 项目编译打包成springboot类型的可执行JAR包,命令启动即可;
xxl-job-executor-sample-frameless: 项目编译打包成JAR包,命令启动即可;

(5) 开发定时任务 Hello World

前提:请确认“调度中心”和“执行器”项目已经成功部署并启动;

本示例以新建一个 “GLUE模式(Java)” 运行模式的任务为例。“GLUE模式(Java)”的执行代码托管到调度中心在线维护,相比“Bean模式任务”需要在执行器项目开发部署上线,更加简便轻量。

  • 新建任务

image.png

  • GLUE模式(Java) 任务开发
    • 点击任务右侧 “GLUE” 按钮,进入 “GLUE编辑器开发界面” ,见下图。“GLUE模式(Java)” 运行模式的任务默认已经初始化了示例任务代码,即打印Hello World。 ( “GLUE模式(Java)” 运行模式的任务实际上是一段继承自IJobHandler的Java类代码,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务,详细介绍请查看第三章节)

image.png
XXL-JOB 实现分布式任务调度 - 图5 :::info 运行模式:

  • BEAN模式:任务以JobHandler方式维护在执行器端;需要结合 “JobHandler” 属性匹配执行器中任务;
  • GLUE模式(Java):任务以源码方式维护在调度中心;该模式的任务实际上是一段继承自IJobHandler的Java类代码并 “groovy” 源码方式维护,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务;
  • GLUE模式(Shell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 “shell” 脚本;
  • GLUE模式(Python):任务以源码方式维护在调度中心;该模式的任务实际上是一段 “python” 脚本;
  • GLUE模式(PHP):任务以源码方式维护在调度中心;该模式的任务实际上是一段 “php” 脚本;
  • GLUE模式(NodeJS):任务以源码方式维护在调度中心;该模式的任务实际上是一段 “nodejs” 脚本;
  • GLUE模式(PowerShell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 “PowerShell” 脚本; :::