2021SC@SDUSC
IWatchManagerzookeeper的watch管理器接口
//将watcher加入指定路径,返回布尔值,若为真,则说明原本对应该路径不存在watcher
boolean addWatch(String path, Watcher watcher);
//将watcher加入指定路径,返回布尔值,若为真,则说明原本对应该路径不存在watcher
//并且设置了watcher模式
default boolean addWatch(String path, Watcher watcher, WatcherMode watcherMode) {
if (watcherMode == WatcherMode.DEFAULT_WATCHER_MODE) {
return addWatch(path, watcher);
}
throw new UnsupportedOperationException();
}
//检查指定的路径是否存在指定的watcher
boolean containsWatcher(String path, Watcher watcher);
//移除指定的路径的指定的watcher
boolean removeWatcher(String path, Watcher watcher);
//移除watcher
void removeWatcher(Watcher watcher);
//给指定路径分配watch event,返回已经被通知的所有watcher
WatcherOrBitSet triggerWatch(String path, EventType type);
//给指定路径分配watch event,返回已经被通知的所有watcher,但忽略被压制的一系列watcher
//返回已经被通知的所有watcher
WatcherOrBitSet triggerWatch(String path, EventType type, WatcherOrBitSet suppress);
//获取watcher数量
int size();
//清空watch管理器
void shutdown();
//返回watch信息的概要
WatchesSummary getWatchesSummary();
//返回watch报告
WatchesReport getWatches();
//返回watcher路径报告
WatchesPathReport getWatchesByPath();
//watches,warning的字符串表示,byPath是true则根据path输出,false则根据连接输出
void dumpWatches(PrintWriter pwriter, boolean byPath);
//返回递归watchers的当前数量
default int getRecursiveWatchQty() {
return 0;
}
WatchManager
IWatchManager的一种实现
成员变量:
//日志
private static final Logger LOG = LoggerFactory.getLogger(WatchManager.class);
//路径到对应watcher的哈希表
private final Map> watchTable = new HashMap<>();
//watcher到对应的一系列路径的哈希表
private final Map> watch2Paths = new HashMap<>();
//watcher模式管理器
private final WatcherModeManager watcherModeManager = new WatcherModeManager();
size方法
public synchronized int size() {
int result = 0;
for (Set watches : watchTable.values()) {
result += watches.size();
}
return result;
}
size方法有synchronized关键字,保证了多线程环境下的安全性
addWatch方法
主要是遍历watchTable的值集合,将每个路径对应的watch的数目都加起来得到size
//addWatch只有两个参数,则默认watcher模式是DEFAULT_WATCHER_MODE
public boolean addWatch(String path, Watcher watcher) {
return addWatch(path, watcher, WatcherMode.DEFAULT_WATCHER_MODE);
}
public synchronized boolean addWatch(String path, Watcher watcher, WatcherMode watcherMode) {
if (isDeadWatcher(watcher)) {
LOG.debug("Ignoring addWatch with closed cnxn");
return false;
}
//根据路径获取对应的一系列watcher
Set list = watchTable.get(path);
if (list == null) {
//如果list为null,那就new一个哈希集合
//选择4是一种折衷,如果一开始就设置过大,可能浪费了内存
//如果满了,再双倍扩大空间
list = new HashSet<>(4);
watchTable.put(path, list);
}
list.add(watcher);
//通过watcher获取对应的路径
Set paths = watch2Paths.get(watcher);
if (paths == null) {
paths = new HashSet<>();
watch2Paths.put(watcher, paths);
}
//指定watcher,指定路径,设置watcher模式
watcherModeManager.setWatcherMode(watcher, path, watcherMode);
return paths.add(path);
}
addWatch主要更新watchTable和watch2Paths两个成员变量,更新映射关系。还有就是也更新了watcherModeManager。



