in registry-center/provider/zookeeper-curator/src/main/java/org/apache/shardingsphere/elasticjob/reg/zookeeper/ZookeeperRegistryCenter.java [427:447]
public void watch(final String key, final DataChangedEventListener listener, final Executor executor) {
CuratorCache cache = caches.get(key + "/");
CuratorCacheListener cacheListener = (curatorType, oldData, newData) -> {
if (null == newData && null == oldData) {
return;
}
Type type = getTypeFromCuratorType(curatorType);
String path = Type.DELETED == type ? oldData.getPath() : newData.getPath();
if (path.isEmpty() || Type.IGNORED == type) {
return;
}
byte[] data = Type.DELETED == type ? oldData.getData() : newData.getData();
listener.onChange(new DataChangedEvent(type, path, null == data ? "" : new String(data, StandardCharsets.UTF_8)));
};
if (executor != null) {
cache.listenable().addListener(cacheListener, executor);
} else {
cache.listenable().addListener(cacheListener);
}
dataListeners.computeIfAbsent(key, k -> new LinkedList<>()).add(cacheListener);
}