XXL-JOB分布式任务调度平台

分手后的思念是犯贱 2024-03-22 11:02 161阅读 0赞

XXL-JOB分布式任务调度平台

XXL-JOB

1、简介

1.1、概述

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

1.2、特性

  • 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
  • 2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
  • 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
  • 4、执行器HA(分布式):任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA;
  • 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
  • 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
  • 7、触发策略:提供丰富的任务触发策略,包括:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发、父子任务触发;
  • 8、调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略、立即补偿触发一次等;
  • 9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
  • 10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;
  • 11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试;
  • 12、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式;
  • 13、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
  • 14、分片广播任务:执行器集群部署时,任务路由策略选择”分片广播”情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务;
  • 15、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
  • 16、故障转移:任务路由策略选择”故障转移”情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
  • 17、任务进度监控:支持实时监控任务进度;
  • 18、Rolling实时日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志;
  • 19、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。
  • 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python、NodeJS、PHP、PowerShell等类型脚本;
  • 21、命令行任务:原生提供通用命令行任务Handler(Bean任务,”CommandJobHandler”);业务方只需要提供命令行即可;
  • 22、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔;
  • 23、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;
  • 24、自定义任务参数:支持在线配置调度任务入参,即时生效;
  • 25、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞;
  • 26、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
  • 27、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
  • 28、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用;
  • 29、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
  • 30、全异步:任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰,理论上支持任意时长任务的运行;
  • 31、跨语言:调度中心与执行器提供语言无关的 RESTful API 服务,第三方任意语言可据此对接调度中心或者实现执行器。除此之外,还提供了 “多任务模式”和“httpJobHandler”等其他跨语言方案;
  • 32、国际化:调度中心支持国际化设置,提供中文、英文两种可选语言,默认为中文;
  • 33、容器化:提供官方docker镜像,并实时更新推送dockerhub,进一步实现产品开箱即用;
  • 34、线程池隔离:调度线程池进行隔离拆分,慢任务自动降级进入”Slow”线程池,避免耗尽调度线程,提高系统稳定性;
  • 35、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
  • 36、权限控制:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;

1.3、下载

相关文档: 中文文档

源码仓库地址















源码仓库地址
GitHub
Gitee

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>

1.4、环境

Maven 3+、JDK1.8+、MySQL5.7+

2、 快速入门

2.1、初始化数据库

在源码中找sql脚本:

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

如下:

  1. #
  2. # XXL-JOB v2.4.1-SNAPSHOT
  3. # Copyright (c) 2015-present, xuxueli.
  4. CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
  5. use `xxl_job`;
  6. SET NAMES utf8mb4;
  7. CREATE TABLE `xxl_job_info` (
  8. `id` int(11) NOT NULL AUTO_INCREMENT,
  9. `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
  10. `job_desc` varchar(255) NOT NULL,
  11. `add_time` datetime DEFAULT NULL,
  12. `update_time` datetime DEFAULT NULL,
  13. `author` varchar(64) DEFAULT NULL COMMENT '作者',
  14. `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
  15. `schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',
  16. `schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',
  17. `misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',
  18. `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
  19. `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
  20. `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
  21. `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
  22. `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
  23. `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
  24. `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
  25. `glue_source` mediumtext COMMENT 'GLUE源代码',
  26. `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
  27. `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
  28. `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
  29. `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
  30. `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
  31. `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
  32. PRIMARY KEY (`id`)
  33. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  34. CREATE TABLE `xxl_job_log` (
  35. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  36. `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
  37. `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
  38. `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
  39. `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
  40. `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
  41. `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
  42. `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
  43. `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
  44. `trigger_code` int(11) NOT NULL COMMENT '调度-结果',
  45. `trigger_msg` text COMMENT '调度-日志',
  46. `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
  47. `handle_code` int(11) NOT NULL COMMENT '执行-状态',
  48. `handle_msg` text COMMENT '执行-日志',
  49. `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
  50. PRIMARY KEY (`id`),
  51. KEY `I_trigger_time` (`trigger_time`),
  52. KEY `I_handle_code` (`handle_code`)
  53. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  54. CREATE TABLE `xxl_job_log_report` (
  55. `id` int(11) NOT NULL AUTO_INCREMENT,
  56. `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
  57. `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
  58. `suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
  59. `fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
  60. `update_time` datetime DEFAULT NULL,
  61. PRIMARY KEY (`id`),
  62. UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
  63. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  64. CREATE TABLE `xxl_job_logglue` (
  65. `id` int(11) NOT NULL AUTO_INCREMENT,
  66. `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
  67. `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
  68. `glue_source` mediumtext COMMENT 'GLUE源代码',
  69. `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
  70. `add_time` datetime DEFAULT NULL,
  71. `update_time` datetime DEFAULT NULL,
  72. PRIMARY KEY (`id`)
  73. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  74. CREATE TABLE `xxl_job_registry` (
  75. `id` int(11) NOT NULL AUTO_INCREMENT,
  76. `registry_group` varchar(50) NOT NULL,
  77. `registry_key` varchar(255) NOT NULL,
  78. `registry_value` varchar(255) NOT NULL,
  79. `update_time` datetime DEFAULT NULL,
  80. PRIMARY KEY (`id`),
  81. KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
  82. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  83. CREATE TABLE `xxl_job_group` (
  84. `id` int(11) NOT NULL AUTO_INCREMENT,
  85. `app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
  86. `title` varchar(12) NOT NULL COMMENT '执行器名称',
  87. `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
  88. `address_list` text COMMENT '执行器地址列表,多地址逗号分隔',
  89. `update_time` datetime DEFAULT NULL,
  90. PRIMARY KEY (`id`)
  91. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  92. CREATE TABLE `xxl_job_user` (
  93. `id` int(11) NOT NULL AUTO_INCREMENT,
  94. `username` varchar(50) NOT NULL COMMENT '账号',
  95. `password` varchar(50) NOT NULL COMMENT '密码',
  96. `role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
  97. `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
  98. PRIMARY KEY (`id`),
  99. UNIQUE KEY `i_username` (`username`) USING BTREE
  100. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  101. CREATE TABLE `xxl_job_lock` (
  102. `lock_name` varchar(50) NOT NULL COMMENT '锁名称',
  103. PRIMARY KEY (`lock_name`)
  104. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  105. INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' );
  106. INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
  107. INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
  108. INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');
  109. commit;

2.2、源码包介绍

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

2.3、调度中心—配置文件介绍

  1. ### 文件路径 /xxl-job/xxl-job-admin/src/main/resources/application.properties
  2. ### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
  3. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
  4. spring.datasource.username=root
  5. spring.datasource.password=root
  6. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  7. ### 报警邮箱
  8. spring.mail.host=smtp.qq.com
  9. spring.mail.port=25
  10. spring.mail.username=mengyb7303@163.com
  11. spring.mail.password=xxx
  12. spring.mail.properties.mail.smtp.auth=true
  13. spring.mail.properties.mail.smtp.starttls.enable=true
  14. spring.mail.properties.mail.smtp.starttls.required=true
  15. spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
  16. ### 调度中心通讯TOKEN [选填]:非空时启用;
  17. xxl.job.accessToken=
  18. ### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
  19. xxl.job.i18n=zh_CN
  20. ## 调度线程池最大线程配置【必填】
  21. xxl.job.triggerpool.fast.max=200
  22. xxl.job.triggerpool.slow.max=100
  23. ### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
  24. xxl.job.logretentiondays=30

启动xxl-job-admin模块

调度中心访问地址: 调度中心控制台 (默认登录账号 “admin/123456”)

调度中心完成启动.

3、开始进行实战操作

3.1、创建Springboot项目,编辑配置文件

引入jar包

  1. <!-- xxl-job-core -->
  2. <dependency>
  3. <groupId>com.xuxueli</groupId>
  4. <artifactId>xxl-job-core</artifactId>
  5. <version>2.3.1</version>
  6. </dependency>

配置文件

  1. # web port
  2. server.port=8081
  3. ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
  4. ### 调度中心部署根地址[选填],调度中心集群部署存在多个地址则用逗号隔开,执行器将会使用改地址进行执行器
  5. xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
  6. ### xxl-job, access token
  7. ### 执行器通讯Token[选填]
  8. xxl.job.accessToken=default_token
  9. ### xxl-job executor appname
  10. ### 执行器AppName[选填]:知心器心跳注册分组依据:为空则关闭自动注册
  11. xxl.job.executor.appname=xxl-job-executor-sample
  12. ### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
  13. ### 执行器注册[选填]: 有限使用该配置作为注册地址,为空时使用内嵌服务“IP:PORT” 作为注册地址,从而更灵活
  14. xxl.job.executor.address=
  15. ### xxl-job executor server-info
  16. ### 执行器IP[选填]: 默认为空表自动获取IP,多网卡可手动指定IP,
  17. xxl.job.executor.ip=
  18. ### 执行器端口号[选填]: 小于等于0则自动获取,默认端口号为9999
  19. xxl.job.executor.port=9999
  20. ### xxl-job executor log-path
  21. ### 执行器日志文件存储磁盘的位置[选填]:
  22. xxl.job.executor.logpath=/Users/mengyb/workspace/gitee/logging/xxl-job
  23. ### xxl-job executor log-retention-days
  24. ### 执行器日志保存天数[选填]:
  25. xxl.job.executor.logretentiondays=30

3.2、创建配置类

  1. package com.xxljob.mengyb.config;
  2. import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. /**
  9. * @ClassName: XxlJobConfig
  10. * @Description: xxl-job配置中心
  11. * @Author: mengyb
  12. * @Date: 2023/5/1 上午10:34
  13. */
  14. @Configuration
  15. public class XxlJobConfig {
  16. private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
  17. @Value("${xxl.job.admin.addresses}")
  18. private String adminAddresses;
  19. @Value("${xxl.job.accessToken}")
  20. private String accessToken;
  21. @Value("${xxl.job.executor.appname}")
  22. private String appname;
  23. @Value("${xxl.job.executor.address}")
  24. private String address;
  25. @Value("${xxl.job.executor.ip}")
  26. private String ip;
  27. @Value("${xxl.job.executor.port}")
  28. private int port;
  29. @Value("${xxl.job.executor.logpath}")
  30. private String logPath;
  31. @Value("${xxl.job.executor.logretentiondays}")
  32. private int logRetentionDays;
  33. @Bean
  34. public XxlJobSpringExecutor xxlJobExecutor() {
  35. logger.info(">>>>>>>>>>> xxl-job config init.");
  36. XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
  37. xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
  38. xxlJobSpringExecutor.setAppname(appname);
  39. xxlJobSpringExecutor.setAddress(address);
  40. xxlJobSpringExecutor.setIp(ip);
  41. xxlJobSpringExecutor.setPort(port);
  42. xxlJobSpringExecutor.setAccessToken(accessToken);
  43. xxlJobSpringExecutor.setLogPath(logPath);
  44. xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
  45. return xxlJobSpringExecutor;
  46. }
  47. /**
  48. * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
  49. *
  50. * 1、引入依赖:
  51. * <dependency>
  52. * <groupId>org.springframework.cloud</groupId>
  53. * <artifactId>spring-cloud-commons</artifactId>
  54. * <version>${version}</version>
  55. * </dependency>
  56. *
  57. * 2、配置文件,或者容器启动变量
  58. * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
  59. *
  60. * 3、获取IP
  61. * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
  62. */
  63. }

3.3、创建一个定时任务

  1. package com.xxljob.mengyb.job;
  2. import com.xxl.job.core.handler.annotation.XxlJob;
  3. import org.springframework.stereotype.Component;
  4. import javax.xml.crypto.Data;
  5. /**
  6. * @ClassName: SimpleXxlJob
  7. * @Description: 测试简单的xxl-job
  8. * @Author: mengyb
  9. * @Date: 2023/5/1 上午10:36
  10. */
  11. @Component
  12. public class SimpleXxlJob {
  13. @XxlJob("sendXxlJob")
  14. public void sendXxlJob() {
  15. System.out.println("发送定时任务:" + new Data());
  16. }
  17. }

3.4、调度中心查看是否注册成功

xxl-job注册到调度中心

3.5、配置任务执行

xxl-job配置任务执行

3.6、启动任务,查看调度任务
xxl-job任务调度成功

简单的Demo完成.

发表评论

表情:
评论列表 (有 0 条评论,161人围观)

还没有评论,来说两句吧...

相关阅读