elastic job原理解析-JobSchedule

ε祈祈猫儿з 提交于 2020-01-24 03:33:25

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服务,关闭不一致状态服务

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!