触发重新分配条件


  • 新的实例加入
  • /jobname/config文件变动
  • 实例变动(加入、删除)


SetUpFacade

新节点启动的时候,会设置重新分片标志

registerStartUpInfo

public void registerStartUpInfo(final boolean enabled) {
listenerManager.startAllListeners();
leaderService.electLeader(); // 选取主节点
serverService.persistOnline(enabled); // /${jobname}/servers/192.16.67.21 设置ENABLED
instanceService.persistOnline(); // 添加instances 比如: /${jobname}/instances/192.16.67.21@-@249736
shardingService.setReshardingFlag(); //设置重新分片标志 jobName/leader/sharding/necessary
if (!reconcileService.isRunning()) {
reconcileService.startAsync();
}
}


ShardingListenerManager

public void start() { // 监听的是/jobName
addDataListener(new ShardingTotalCountChangedJobListener());
addDataListener(new ListenServersChangedJobListener());
}


ShardingTotalCountChangedJobListener

/jobname/config配置文件变动 触发
// /jobname/config配置文件变动 触发
class ShardingTotalCountChangedJobListener extends AbstractJobListener {

@Override
protected void dataChanged(final String path, final Type eventType, final String data) {
if (configNode.isConfigPath(path) && 0 != JobRegistry.getInstance().getCurrentShardingTotalCount(jobName)) {
int newShardingTotalCount = YamlEngine.unmarshal(data, JobConfigurationPOJO.class).toJobConfiguration().getShardingTotalCount(); // 新的分片数(配置文件变了)
if (newShardingTotalCount != JobRegistry.getInstance().getCurrentShardingTotalCount(jobName)) { // 数量不一致
shardingService.setReshardingFlag(); // 设置需要分片标志
JobRegistry.getInstance().setCurrentShardingTotalCount(jobName, newShardingTotalCount); // 设置新的分片总数
}
}
}
}

ListenServersChangedJobListener

// 任务服务器数量事件
class ListenServersChangedJobListener extends AbstractJobListener {

@Override // jobname/instances下面有新增、删除节点触发 // NODE_CREATED NODE_DELETED 要么有新的servers节点 或者 是否是服务器路径jobname/servers/${ip}
protected void dataChanged(final String path, final Type eventType, final String data) {
if (!JobRegistry.getInstance().isShutdown(jobName) && (isInstanceChange(eventType, path) || isServerChange(path))) {
shardingService.setReshardingFlag();
}
}
// isInstancePath: jobname/instances
private boolean isInstanceChange(final Type eventType, final String path) {
return instanceNode.isInstancePath(path) && Type.NODE_CHANGED != eventType; // NODE_CREATED NODE_DELETED
}

private boolean isServerChange(final String path) {
return serverNode.isServerPath(path);
}
}