1、Elastic Job介绍
我们开发定时任务一般都是使用quartz或者spring-task,无论是使用quartz还是spring-task,我们至少会遇到以下两个痛点:
- 不敢轻易跟着应用服务器多节点部署,可能会重复多次执行而引发系统逻辑的错误。
- quartz的集群仅仅只是用来HA,节点数量的增加并不能给我们的每次执行效率带来提升,即不能实现水平扩展。
说明:Elastic-job分布式任务调度,就可以帮我们解决上面两个痛点。
Elastic-Job是当当开源的一款非常好用的分布式任务调度框架,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。Elastic-Job-Lite这也是本次所要讲解和使用的子项目。
主要功能:
-
分布式调度协调
-
弹性扩容缩容
-
失效转移
-
错过执行作业重触发
-
作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
-
自诊断并修复分布式不稳定造成的问题
-
支持并行调度
-
支持作业生命周期操作
-
丰富的作业类型
-
Spring整合以及命名空间提供
-
运维平台
官网:http://www.elasticjob.io/
2、Elastic Job入门
(1)作业类型介绍
Elastic-Job提供Simple、Dataflow和Script 3种作业类型。 方法参数shardingContext包含作业配置、分片和运行时信息。可通过getShardingTotalCount(), getShardingItem()
等方法分别获取分片总数,运行在本作业服务器的分片序列号等。
-
Simple类型作业
意为简单实现,未经任何封装的类型。需实现SimpleJob接口。该接口仅提供单一方法用于实现,此方法将定时执行。与Quartz原生接口相似,但提供了弹性扩缩容和分片等功能
。 -
Dataflow类型作业
Dataflow类型用于处理数据流
,需实现DataflowJob接口。该接口提供2个方法可供实现,分别用于抓取(fetchData)和处理(processData)数据。
-
Script类型作业
意为脚本类型作业,支持shell,python,perl等所有类型脚本
。只需通过控制台或代码配置scriptCommandLine即可,无需编码。执行脚本路径可包含参数,参数传递完毕后,作业框架会自动追加最后一个参数为作业运行时信息。
3、Elastic Job使用前准备
(1)安装zk【zookeeper】
第一步:Elastic-Job使用了zookeeper作为注册中心;所以可以解压“资料/zookeeper-3.4.9.tar.gz”文件。
第二步:在解压的“zookeeper-3.4.9“文件夹下创建“data”文件夹
第三步:找到“zookeeper-3.4.9\conf”路径,复制zoo_sample.cfg 为 zoo.cfg
然后在里面修改存放zookeeper的运行数据和日志的路径dataDir(12行);将该值修改为第二步骤中创建的data文件夹的路径。如下:
dataDir=D:\\zookeeper-xxx-xx\\datas
启动zk
- win
直接双击启动文件启动即可
- Linux
到zk解压目录下的bin目录下使用以下命令启动
./zkServer.sh start
4、Elastic Job作业开发
入门例子:
步骤:
A:spring集成elastic job
(1)先创建项目
(2)导入依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.1.5</version>
</dependency>