一、 zookeeper中的watcher
1. exists :监控的是【znode】的CUD 的操作
2. getdata 的时候注册的watcher【U,D 监控】update delete
exists 可以获取到当前的节点,但是无法获取到内容。
getdata 可以获取到最新的内容。
异常: 如果znode不存,是无法监控getdata
官方文档: A KeeperException with error code KeeperException.NoNode will be thrown if no node with the given path exists.
同样的实现接口IWatcher
public class DataWatcher: IWatcher { private ZooKeeper _zookeeper = null; Action<WatchedEvent, string> _action = null; public DataWatcher(ZooKeeper zookeeper, Action<WatchedEvent, string> action) { _zookeeper = zookeeper; _action = action; } public void Process(WatchedEvent @event) { try { //Console.WriteLine("path={0},state={1},type={2}", @event.Path, @event.State, @event.Type); //通过getdata获取内容 var content = Encoding.UTF8.GetString(_zookeeper.GetData(@event.Path, this, null)); if (_action != null) { _action(@event, content); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
使用:
Console.WriteLine("欢迎来到zookeeper.net 9 "); try { var bytes = zookeeper.GetData("/google", new DataWatcher(zookeeper, (e, data) => { //data 是返回的内容 Console.WriteLine("path={0},state={1},type={2},data={3}", e.Path, e.State, e.Type, data); }), null); } catch (KeeperException ex) { throw new Exception(ex.Message); }
3. getchildren 的时候注册的watcher
子节点的add,remove 都是能够监控的到状态。【Update是监控不到的,需要使用exists】
public class ChildrenWatcher : IWatcher { private ZooKeeper _zookeeper = null; Action<WatchedEvent, IEnumerable<string>> _action = null; public ChildrenWatcher(ZooKeeper zookeeper, Action<WatchedEvent, IEnumerable<string>> action) { _zookeeper = zookeeper; _action = action; } public void Process(WatchedEvent @event) { try { //通过getdata获取内容 var list = _zookeeper.GetChildren(@event.Path, this, null); if (_action != null) { _action(@event, list); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
try { var list_t = zookeeper.GetChildren("/google", new ChildrenWatcher(zookeeper, (e, data) => { Console.WriteLine("path={0},state={1},type={2},data={3}", e.Path, e.State, e.Type, string.Join(",", data)); }), null); } catch (KeeperException ex) { throw new Exception(ex.Message); }
执行创建,删除后的效果
监听结果
![](https://images2018.cnblogs.com/blog/514661/201803/514661-20180315215454878-797114316.png)
应用场景:
【智能感知上下线】 服务注(provider) 和发现(client)