目录
1.概述
1.1 什么是任务调度
任务调度:系统为了自动完成热定任务,在约定的特定时刻去执行任务的过程
基础实现方法
1)多线程方式实现:
2)JDK提供:Timer方式实现(1个Timer对应1个线程,实际上是多线程去执行)
3)ScheduledExecutor方式实现:
4)第三方Quartz框架方式实现(按日期特定时间执行)
// 简单实现
Cron表达式:
1.2 分布式任务调度
分布式系统:单系统 -> 系统服务拆分
分布式调度
分布式调度要实现的目标:
1.并行的任务调度
2.高可用
3.弹性扩容
4.任务管理与监测
5.避免任务重复执行
分布式锁
Zookeeper选举机制
1.3 Elastic-Job介绍
2.快速入门
2.1 环境搭建
JDK1.7以上
Maven3.0.4以上
Zookeeper3.4.6以上
1.Zookeeper安装启动
2.创建Maven工程
导包
2.2 代码实现
核心:实现SimpleJob接口,重写execute方法
启动类的实现:
2.3 工作原理
整体架构
ZK作用
1️⃣ 信息的存储
2️⃣ 选举
演示:
1️⃣信息存储
2️⃣选举
3.SpringBoot开发分布式任务
3.1 环境搭建
导包
(代码不全)
3.2 作业分片
概念
分片是逻辑概念,比如根据文件类型进行分片,不同定时任务进程对应不同文件类型;
分片逻辑是自定义的;
执行是机器做的;
作业分片实现
创建数据库
导入Maven依赖
代码改造
配置项说明
常用分片策略
RotateServerByNameJobShardingStrategy
3.3 DataFlow接口实现
实现接口:
重写方法:
1)抓取数据
2)处理数据
创建Configuration:
4.高级
4.1 事件追踪-日志
自动执行会生成两张数据库表:
4.2 搭建Consoles监控平台:
4.3 dump命令
课程小结
附录
代码结构
具体实现
配置项:
zk.serverList=localhost:2181
zk.namespace=elasticjob-test
@Configuration
public class RegCenterConfig {
/**
* 配置zookeeper
*
* @param serverList
* @param namespace
* @return
*/
@Bean(initMethod = "init")
public ZookeeperRegistryCenter zookeeperRegistryCenter(
@Value("${zk.serverList}") final String serverList,
@Value("${zk.namespace}") final String namespace) {
return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));
}
}
@Configuration
public class MySimpleJobConfig {
@Autowired
private ZookeeperRegistryCenter zookeeperRegistryCenter;
@Bean
public SimpleJob stockJob() {
return new MySimpleJob();
}
@Bean(initMethod = "init")
public JobScheduler simpleJobScheduler(final SimpleJob simpleJob) {
return new SpringJobScheduler(simpleJob, zookeeperRegistryCenter, createSimpleJobConfiguration());
}
private static LiteJobConfiguration createSimpleJobConfiguration() {
// 定义作业核心配置
JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration
.newBuilder("SimpleJobDemo", "0/5 * * * * ?", 4)
.shardingItemParameters("0=北京,1=上海,2=广州,3=深圳").build();
// 定义SIMPLE类型配置
SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, MySimpleJob.class.getCanonicalName());
// 定义Lite作业根配置
JobRootConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build();
return (LiteJobConfiguration) simpleJobRootConfig;
}
}
public class MySimpleJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
//获取分片总数
int shardingTotalCount = shardingContext.getShardingTotalCount();
//获取分片项
int shardingItem = shardingContext.getShardingItem();
//获取分片项参数
String shardingParameter = shardingContext.getShardingParameter();
System.out.println("分片总数:" + shardingTotalCount);
System.out.println("分片项:" + shardingItem);
System.out.println("分片项参数:" + shardingParameter);
System.out.println("作业名称:" + shardingContext.getJobName());
//不同分片项进行不同处理
switch (shardingItem) {
case 0:
System.out.println("物流分发至:" + shardingParameter);
break;
case 1:
System.out.println("物流分发至:" + shardingParameter);
break;
case 2:
System.out.println("物流分发至:" + shardingParameter);
break;
case 3:
System.out.println("物流分发至:" + shardingParameter);
break;
}
}
}
测试
运行4个实例发现4个分片会分别跑一个,停掉一个会自动触发故障转移