家用水果榨汁机⼀、简介
1.1、调度框架/⼯具
单节点调度:Timer,ScheduledExecutorService,Spring Task
分布式调度:Quartz,XXL-Job,Elastic-Job,TBSchedule,DolphinScheduler,……
1.2、XXL-JOB介绍
基本信息
⼤众点评⼀个叫许雪⾥的程序员开发的⼀个任务调度框架,所以项⽬名叫XXL-JOB,嗯…… 使⽤⼴泛,⽬前已有超过400+公司接⼊
项⽬地址:,
术语解释
调度中⼼:服务端 & 管理后台,负责管理调度信息及发出调度请求 执⾏器:可以简单理解为⼀个Group,由多个具有相同名称的执⾏器节点组成
执⾏器节点:任务的实际执⾏节点,客户端,负责接收调度请求并执⾏任务逻辑
任务:具体的执⾏逻辑,可以有多种实现⽅式,如Java、Shell、Python等,任务都需要绑定到某个具体的执⾏器上
调度:调度中⼼发起的⼀次远程任务调度,任务调度与任务执⾏解耦,调度后马上返回 执⾏:执⾏器接收到调度后本地异步执⾏,执⾏完成后异步通知调度中⼼执⾏结果
框架特性
XXL-JOB是轻量级、易扩展、⾼可⽤、开箱即⽤的分布式 任务调度框架
轻量级:环境依赖Maven3+,Jdk1.8+,Mysql5.7+;整个框架只有调度中⼼和执⾏器
分布式:调度中⼼和执⾏器均可以集部署
易扩展:可以随时增减调度中⼼和执⾏器部署节点
⾼可⽤:在分布式部署模式下,可以容忍部分调度中⼼节点宕机;⾄于执⾏器嘛,当然要看具体的业务逻辑是否⽀持幂等或事务⽅式执⾏
开箱即⽤:Java实现,调度中⼼项⽬经过简单配置后即可直接部署运⾏,执⾏器的使⽤也⽐较简单
任务调度:只负责任务的管理和调度,不与具体的任务执⾏耦合,保证了调度系统的可控度与稳定性
功能特点
触发策略(什么时候执⾏):Cron触发、固定间隔触发、固定延时触发、API(事件)触发、⼿动触发、⽗⼦任务触发 路由策略(由谁执⾏):第⼀个、最后⼀个、随机、⼀致性HASH、忙碌转移等
执⾏控制(如何执⾏):超时控制,失败重试,失败告警,分⽚执⾏,阻塞策略,过期策略等
管理⽅⾯:进度监控,运⾏报表,⽤户管理,权限管理
GLUE模式:⽀持Java Bean、Shell、Python等⽅式执⾏
……
1.3、XXL-JOB的使⽤
调度中⼼部署
下载源码,最新版本为2.3.0,在xxl-job-admin模块下修改application.properties⽂件配置参数,主要是MySQL的连接信息,其它视情况调整或添加
⼿动执⾏xxl-job/doc/db/table_xxl_job.sql内容,创建相关数据库表
打开管理页⾯:,默认登录账号 “admin/123456”,登录后主页⾯如下:
执⾏器接⼊
引⼊core包依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
添加配置信息
沟槽三通### 调度中⼼地址,与上⾯保持⼀致即可
xxl.job.admin.addresses=127.0.0.1:8080/xxl-job-admin
### access token,需要与admin的token保持⼀致,可以都为空
榄香烯乳状注射液
xxl.job.accessToken=
### 执⾏器名称,⽤于管理后台添加执⾏器,对应AppName
utor.appname=executor-sample
### 执⾏器地址,ip:port,与下⾯的配置⼆选⼀
utor.address=
### 执⾏器ip,为空时调度中⼼⾃动获取,建议为空
utor.ip=
### 执⾏器端⼝
utor.port=9997
### ⽇志保存路径
utor.logpath=/data/applogs/xxl-job/jobhandler
### ⽇志保存天数
utor.logretentiondays=30三元催化清洗剂
配置启动类
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${utor.appname}")
private String appname;
@Value("${utor.address}")
private String address;
@Value("${utor.ip}")
private String ip;
@Value("${utor.port}")
private int port;
@Value("${utor.logpath}")
private String logPath;
@Value("${utor.logretentiondays}")
private int logRetentionDays;
@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;
}
}
任务实现类
@Component
龙脑抑菌剂public class SampleXxlJob {
@XxlJob("demoJobHandler")// demoJobHandler为任务名称
public void demoJobHandler()throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");// 通过该⽅法记录的⽇志在调度中⼼可以查看
for(int i =0; i <5; i++){
XxlJobHelper.log("beat at:"+ i);
TimeUnit.SECONDS.sleep(2);
}摇臂
// 默认会返回执⾏成功
}
}
启动客户端服务
添加任务并执⾏
【执⾏器管理】中新增执⾏器,AppName为客户端配置的执⾏器名词,注册⽅式建议选⾃动注册
【任务管理】中新增任务,选择刚添加的执⾏器,允许模式选择Bean,JobHandler填@XxlJob中指定的名称,其它参数视情况填写【任务管理】中刚才添加的任务,操作下拉框选择【执⾏⼀次】,调度中⼼向执⾏器发起⼀次调度
【调度⽇志】中查看任务调度结果及执⾏结果
⼆、XXL-JOB原理分析
2.1、⼀些问题
在开始进⾏分析前,你可能会有如下⼀些疑问,我们先来看⼀下,希望后⾯的分析能帮助你解开这些疑惑。
使⽤相关
同⼀个任务可以并⾏执⾏吗?
调度中⼼可以看到任务的执⾏过程和结果吗?
可以中断执⾏中的任务吗?
任务执⾏失败了怎么办?
执⾏中的任务宕机了怎么办?
⼦任务是如何被调度的?
任务计算量很⼤,如何提⾼执⾏效率?
实现相关
调度中⼼在集模式下是如何进⾏调度的(谁来调度,如何防⽌重复调度,如何进⾏负载均衡)?
如何选择执⾏器节点?
最⼤可以⽀持到多少并发调度?
调度是准时触发的吗,精度能达到多少,如何实现?
调度中⼼重启后,未调度的定时任务怎么办?
调度⽇志和运⾏⽇志分别保存在哪?
2.2、整体架构
官⽹架构图↑↑↑↑↑↑
上⼀张为官⽹架构图,重在描述整体功能模块划分
下⼀张为笔者重新梳理的架构图,补充了⼀些实现细节,两张图结合着看可以加深理解。以下说明均针对第⼆张图系统组成