Java 杂谈

elastic job源码分析 - 分片监听管理器

2018-09-04  本文已影响21人  耶也夜

elastic job启动时,分片监听管理器io.elasticjob.lite.internal.sharding.ShardingListenerManager会启动2个监听器,分别是任务分片总数改变监听器服务改变监听器

public void start() {
    // 启动任务分片总数改变监听器
    addDataListener(new ShardingTotalCountChangedJobListener());
    // 启动服务改变监听器
    addDataListener(new ListenServersChangedJobListener());
}

任务分片总数改变监听器

任务分片总数改变监听器监听zk上的任务配置节点jobName/config,当该节点值改变时,实例判断当前配置的分片数是否和本地缓存分片数不一致,否则设置需要重新分片的标记,并修改本地缓存的分片数为最新值。

if (configNode.isConfigPath(path) && 0 != JobRegistry.getInstance().getCurrentShardingTotalCount(jobName)) {
    int newShardingTotalCount = LiteJobConfigurationGsonFactory.fromJson(data).getTypeConfig().getCoreConfig().getShardingTotalCount();
    if (newShardingTotalCount != JobRegistry.getInstance().getCurrentShardingTotalCount(jobName)) {
        shardingService.setReshardingFlag();
        JobRegistry.getInstance().setCurrentShardingTotalCount(jobName, newShardingTotalCount);
    }
}

设置需要重新分片的标记即在zk创建节点jobName/leader/sharding/necessary.

服务改变监听器

服务改变监听器会监听zk实例节点jobName/instances的变化和服务节点jobName/servers的变化,当改变条件满足时,会设置需要重新分片的标记。
实例节点变化需要满足:非实例节点数据值改变:

instanceNode.isInstancePath(path) && Type.NODE_UPDATED != eventType;

服务节点只要发生改变,即满足条件:

serverNode.isServerPath(path);
上一篇下一篇

猜你喜欢

热点阅读