当前位置:网站首页>分布式定时任务之XXL-JOB
分布式定时任务之XXL-JOB
2022-07-08 00:30:00 【丨Jack_Chen丨】
分布式定时任务之XXL-JOB
XXL-JOB概述
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
GitHub: https://github.com/xuxueli/xxl-job
文档地址: https://www.xuxueli.com/xxl-job/
XXL-JOB快速入门
1.配置部署“调度中心”
参照文档部署: xxl-job-admin作为“调度中心”
作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。

2.创建执行器项目
作用:负责接收“调度中心”的调度并执行
将xxl-job-core安装到本地后引入该maven依赖,或引入中央仓库中的坐标地址
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.1-SNAPSHOT</version>
</dependency>
3.配置执行器项目
server.port=9001
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:9000/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=my-job
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=8000
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=D:/logs
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
4.配置执行器组件
@Configuration
public class MyJobConfig {
private Logger logger = LoggerFactory.getLogger(MyJobConfig.class);
@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 myJobExecutor() {
logger.info("config init start .....");
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);
logger.info("config init end .....");
return xxlJobSpringExecutor;
}
}
5.开发Job方法
1、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
2、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
3、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
@Component
public class MyJobHandler {
private static Logger logger = LoggerFactory.getLogger(MyJobHandler.class);
/** * 1、简单任务示例(Bean模式) */
@XxlJob(value = "demoJobHandler",init = "init",destroy = "destroy")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("demoJobHandler start ......");
logger.info("demoJobHandler start ......");
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(1);
}
XxlJobHelper.log("demoJobHandler end ......");
logger.info("demoJobHandler end ......");
// default success
XxlJobHelper.handleSuccess();
//XxlJobHelper.handleFail();
}
/** * 2、分片广播任务 */
@XxlJob("shardingJobHandler")
public void shardingJobHandler() throws Exception {
// 分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
logger.info("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
// 业务逻辑
for (int i = 0; i < shardTotal; i++) {
if (i == shardIndex) {
XxlJobHelper.log("第 {} 片, 命中分片开始处理", i);
logger.info("第 {} 片, 命中分片开始处理", i);
} else {
XxlJobHelper.log("第 {} 片, 忽略", i);
logger.info("第 {} 片, 忽略", i);
}
}
}
public void init() {
logger.info("init");
}
public void destroy() {
logger.info("destory");
}
}
6.项目结构

调度中心的使用
1.创建执行器


2.新建调度任务
对新建的任务进行参数配置,运行模式选中 “BEAN模式”,JobHandler属性填写任务注解“@XxlJob”中定义的值
3.查看日志


4.准备分布式环境
8080与8081两台机器部署相同代码
5.路由策略之轮询

查看日志

6.分发广播

2021-04-26 14:01:48.240 INFO 71112 --- [ Thread-11] cn.ybzy.demo.jobhandler.MyJobHandler : 分片参数:当前分片序号 = 0, 总分片数 = 2
2021-04-26 14:01:48.241 INFO 71112 --- [ Thread-11] cn.ybzy.demo.jobhandler.MyJobHandler : 第 0 片, 命中分片开始处理
2021-04-26 14:01:48.241 INFO 71112 --- [ Thread-11] cn.ybzy.demo.jobhandler.MyJobHandler : 第 1 片, 忽略
2021-04-26 14:02:03.445 INFO 91184 --- [ Thread-9] cn.ybzy.demo.jobhandler.MyJobHandler : 分片参数:当前分片序号 = 1, 总分片数 = 2
2021-04-26 14:02:03.445 INFO 91184 --- [ Thread-9] cn.ybzy.demo.jobhandler.MyJobHandler : 第 0 片, 忽略
2021-04-26 14:02:03.446 INFO 91184 --- [ Thread-9] cn.ybzy.demo.jobhandler.MyJobHandler : 第 1 片, 命中分片开始处理
7.故障转移

配置属性详细说明
基础配置:
- 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 "执行器管理" 进行设置;
- 任务描述:任务的描述信息,便于任务管理;
- 负责人:任务的负责人;
- 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔;
触发配置:
- 调度类型:
无:该类型不会主动触发调度;
CRON:该类型将会通过CRON,触发任务调度;
固定速度:该类型将会以固定速度,触发任务调度;按照固定的间隔时间,周期性触发;
固定延迟:该类型将会以固定延迟,触发任务调度;按照固定的延迟时间,从上次调度结束后开始计算延迟时间,到达延迟时间后触发下次调度;
- CRON:触发任务执行的Cron表达式;
- 固定速度:固件速度的时间间隔,单位为秒;
- 固定延迟:固件延迟的时间间隔,单位为秒;
任务配置:
- 运行模式:
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" 脚本;
- JobHandler:运行模式为 "BEAN模式" 时生效,对应执行器中新开发的JobHandler类“@JobHandler”注解自定义的value值;
- 执行参数:任务执行所需的参数;
高级配置:
- 路由策略:当执行器集群部署时,提供丰富的路由策略,包括;
FIRST(第一个):固定选择第一个机器;
LAST(最后一个):固定选择最后一个机器;
ROUND(轮询):;
RANDOM(随机):随机选择在线的机器;
CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
- 子任务:每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务ID所对应的任务的一次主动调度。
- 调度过期策略:
- 忽略:调度过期后,忽略过期的任务,从当前时间开始重新计算下次触发时间;
- 立即执行一次:调度过期后,立即执行一次,并从当前时间开始重新计算下次触发时间;
- 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略;
单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;
- 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;
- 失败重试次数;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;
边栏推荐
- 快速熟知XML解析
- Voice of users | winter goes and spring comes, waiting for flowers to bloom -- on gbase 8A learning comprehension
- Get familiar with XML parsing quickly
- How to make enterprise recruitment QR code?
- 写一个纯手写的qt的hello world
- Break algorithm --- map
- Cross modal semantic association alignment retrieval - image text matching
- Euler Lagrange equation
- Write a pure handwritten QT Hello World
- Is it safe to open an account on your mobile phone for small amount of stock speculation?
猜你喜欢
随机推荐
Nacos microservice gateway component +swagger2 interface generation
进程和线程的退出
How mysql/mariadb generates core files
burpsuite
Partage d'expériences de contribution à distance
Optimization of ecological | Lake Warehouse Integration: gbase 8A MPP + xeos
How to make the conductive slip ring signal better
common commands
Usage of hydraulic rotary joint
项目经理有必要考NPDP吗?我告诉你答案
From starfish OS' continued deflationary consumption of SFO, the value of SFO in the long run
Chapter 7 behavior level modeling
Codeforces Round #633 (Div. 2) B. Sorted Adjacent Differences
ANSI / nema- mw- 1000-2020 magnetic iron wire standard Latest original
SQLite3 data storage location created by Android
PHP 计算个人所得税
[target tracking] |atom
发现值守设备被攻击后分析思路
QT build with built-in application framework -- Hello World -- use min GW 32bit
How to fix the slip ring








