jobSchedule
schedulerFacade = new SchedulerFacade(regCenter, liteJobConfig.getJobName(), elasticJobListenerList);
作业信息持久化
调用serverService的persistOnline(enabled)方法,只有在job存在的情况下才会将job持久化到zk上。【enabled改作业是否启用】
public void persistOnline(final boolean enabled) {
if (!JobRegistry.getInstance().isShutdown(jobName)) {
jobNodeStorage.fillJobNode(serverNode.getServerNode(JobRegistry.getInstance().getJobInstance(jobName).getIp()), enabled ? "" : ServerStatus.DISABLED.name());
}
}
持久化作业运行实例信息
调用instanceService的persistOnline()方法。将job加入zk的临时节点中
public void persistOnline() {
jobNodeStorage.fillEphemeralJobNode(instanceNode.getLocalInstanceNode(), "");
}
标记需要分片的job
调用ishardingService的setReshardingFlag()方法。在该任务下新增necessary节点,新增路径 leader/sharding/necessary
public void setReshardingFlag() {
jobNodeStorage.createJobNodeIfNeeded(ShardingNode.NECESSARY);
}
初始化作业监听服务
调用imonitorService的listen()接口,从config中加载port,提供dump的命令,实现dump jvm相关信息
调解分布式作业不一致状态服务
调用reconcileService的isRunning服务。reconcileService继承自guava的AbstractScheduledService。
reconcileService重写类runOneIteration和Scheduler方法,定义了调度的逻辑和调度的周期。
@Override
protected void runOneIteration() throws Exception {
LiteJobConfiguration config = configService.load(true);
int reconcileIntervalMinutes = null == config ? -1 : config.getReconcileIntervalMinutes();
if (reconcileIntervalMinutes > 0 && (System.currentTimeMillis() - lastReconcileTime >= reconcileIntervalMinutes * 60 * 1000)) {
lastReconcileTime = System.currentTimeMillis();
if (leaderService.isLeaderUntilBlock() && !shardingService.isNeedSharding() && shardingService.hasShardingInfoInOfflineServers()) {
log.warn("Elastic Job: job status node has inconsistent value,start reconciling...");
shardingService.setReshardingFlag();
}
}
}
@Override
protected Scheduler scheduler() {
return Scheduler.newFixedDelaySchedule(0, 1, TimeUnit.MINUTES);
}
当前节点为主节点,无分片标记,当前分片数和配置文件不一致,则重新分片
终止作业调度
这是schedule facade中另一个功能,他会在节点发生变化的时候调用
public void shutdownInstance() {
if (leaderService.isLeader()) {
leaderService.removeLeader();
}
monitorService.close();
if (reconcileService.isRunning()) {
reconcileService.stopAsync();
}
JobRegistry.getInstance().shutdown(jobName);
}
从zk上删除节点信息,关闭monitor服务,关闭不一致状态服务
来源:CSDN
作者:crazier_huang
链接:https://blog.csdn.net/crazier_huang/article/details/103898797