网上关于java的Zookeeper开源jar包的使用有很多,但C#的ZookeeperNet还不是很多,做项目的时候也遇到了很多问题,主要还是对这些方法的使用不清晰,于是我就把每个方法都测了一遍。
这里,分享一下我的使用经验。
create | setData | delete | None | |
---|---|---|---|---|
existAsync(path,watcher) | Y | Y | Y | Y |
getDataAsync(path,watcher) | N | Y | Y | Y |
getChildrenAsync(path,watcher) | Y | N | Y | Y |
- exist(path,watcher)
触发:path create/path delete/setdata 会触发
注册:node不存在不会抛NoNodeException
也就是说不存在的点也可以监听,当他创建时会通知!(提前监听) - getdata(path,watcher)
触发:setData(path) /delete(path)
注册:节点不存在会抛NoNodeException
get不能对不存在的节点注册监听
这里一定要注意加await zk.getDataAsync(path, watcher),不加await是catch不了异常的!!!
await zk.getDataAsync(path, watcher))
- getChildren
getChildren的节点必须存在! 否则会抛出NoNodeException。 - None事件
None事件主要就是当zookeeper实例的连接状态发生变化时会通知所有的watcher。
一点经验:我在用VS断点调试时,经常会出现这个None事件,但我去查看连接状态却发现明明是Connected啊?我想这可能是停顿时间过长,Disconnected了但因为zk客户端本身带有自动重连的机制,所以又连上了。
这里需要注意,对于普通的节点watcher最好不要处理None事件。 - 其它一些经验:
对于同一个Watcher实例,即使用不同的方法注册了多次,当事件发生时,还是只会通知一次。
但如果用同一个方法,两个watcher去注册监听,这时是都会通知的。