特性
- 弹性调度:支持分片,弹性伸缩
- 作业治理:错过的作业重新执行,自动修复
- 可视化管理:可以在控制台管理Job
整体架构
整体开发只需要关注Job相关业务,配置好Job即可。
- simpleJob:普通作业
- DataflowJob:处理流式数据,避免数据量过大,每次都先fetch到数据,然后再处理数据,直到fetch没有数据为止。
SimpleJob
maven依赖 : 如果配置有数据库,还需要数据库相关依赖
2.1.5版本有点旧了
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
创建job类
public class MyJob implements SimpleJob {
public void execute(ShardingContext context) {
System.out.println(
String.format("分片项 ShardingItem: %s | 运行时间: %s | 线程ID: %s | 分片参数: %s ",
context.getShardingItem(),
new SimpleDateFormat("HH:mm:ss").format(new Date()),
Thread.currentThread().getId(),
context.getShardingParameter())
);
}
}
配置Job然后启动
public static void main(String[] args) {
// ZK注册中心
CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(
new ZookeeperConfiguration("192.168.169.223:2181", "ejob-standalone")
);
regCenter.init();
// 数据源 , 事件执行持久化策略 : 可以不配
// DruidDataSource dataSource =new DruidDataSource();
// dataSource.setDriverClassName("com.mysql.jdbc.Driver");
// dataSource.setUrl("jdbc:mysql://192.168.169.223:3306/study?useUnicode=true&characterEncoding=utf-8");
// dataSource.setUsername("root");
// dataSource.setPassword("Asd456654.");
// JobEventConfiguration jobEventConfig = new JobEventRdbConfiguration(dataSource);
// 定义作业核心配置
JobCoreConfiguration coreConfig = JobCoreConfiguration
.newBuilder("MySimpleJob", "0/5 * * * * ?", 4)
.shardingItemParameters("0=RDP, 1=CORE, 2=SIMS, 3=ECIF").failover(true).build();
// 定义SIMPLE类型配置
SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(
coreConfig, MyJob.class.getCanonicalName());
// 作业分片策略
// 基于平均分配算法的分片策略
String jobShardingStrategyClass = AverageAllocationJobShardingStrategy.class.getCanonicalName();
// 定义Lite作业根配置
LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration
.newBuilder(simpleJobConfig)
.jobShardingStrategyClass(jobShardingStrategyClass).build();
// LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build();
// 构建Job:多个job就重复创建jobScheduler进行配置
new JobScheduler(regCenter, simpleJobRootConfig).init();
}
DataflowJob
// 初始化代码
private static void DataFlowJob01(CoordinatorRegistryCenter regCenter) {
// 定义作业核心配置==>修改cron要么清除zk数据,要么修改jobName
JobCoreConfiguration coreConfig = JobCoreConfiguration
.newBuilder("MyDFJob", "0/5 * * * * ?", 4)
.shardingItemParameters("0=RDP, 1=CORE, 2=SIMS, 3=ECIF").failover(true).build();
DataflowJobConfiguration dataflowJobConfiguration=new DataflowJobConfiguration(
coreConfig,MyDataflowJob.class.getCanonicalName(),true
);
// 作业分片策略
// 基于平均分配算法的分片策略
String jobShardingStrategyClass = AverageAllocationJobShardingStrategy.class.getCanonicalName();
LiteJobConfiguration dataflowJobRootConfig = LiteJobConfiguration
.newBuilder(dataflowJobConfiguration)
.jobShardingStrategyClass(jobShardingStrategyClass).build();
new JobScheduler(regCenter, dataflowJobRootConfig).init();
}
@Override
public List<String> fetchData(ShardingContext context) {
List<String> foos = new ArrayList<>();
double random = Math.random();
while (true) {
if (random > 0.5) {
foos.add("处理线程:"+Thread.currentThread().getName()+" random:" + random + " 分片:" + context.getShardingItem());
}else {
break;
}
}
return foos;
}
@Override
public void processData(ShardingContext context, List list) {
System.out.println("----开始处理数据:"+Thread.currentThread().getName());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
console : 控制台安装
配置console登录密码
启动console
界面非常简洁命令:添加配置中心即可,对于namespace相关