上一篇:Curator客户端创建zk节点源码分析
一、demopublic static void main(String[] args) throws Exception { RetryPolicy retryPolicy = new ExponentialBackoffRetry( 1000, 3); Curatorframework client = CuratorframeworkFactory.newClient( "localhost:2181", 5000, 3000, retryPolicy); client.start(); PathChildrenCache pathChildrenCache = new PathChildrenCache( client, "/cluster", true); pathChildrenCache.start(); // cache就是把zk里得数据缓存到了你得客户端里来 // 你可以针对这个缓存得数据加监听器,去观察zk里得数据得变化 pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() { public void childEvent(Curatorframework curatorframework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception { } }); }
我们来看一下这行代码,是如何创建得
PathChildrenCache pathChildrenCache = new PathChildrenCache( client, "/cluster", true);
注释:启动缓存。缓存不会自动启动。您必须调用此方法。
说明调用start方法时默认不会缓存数据
默认走NORMAL分支,我们点进去看看
这里就启动了一个线程,将传递进来得Operation放入operationsQuantizer,如果放成功则启动一个线程,将Operation从operationsQuantizer删除,调用invoke方法,我们在返过去看一下这个Operation
这个里面invoke方法会去调用PathChildrenCache得refresh方法,我们在感谢阅读进去看一下
方法注释:
这个方法得是确保监听得目录在zk中已经存在了
这里会根据构造器得模式先获取出一个GetChildrenBuilder,在调用GetChildrenBuilder得usingWatcher方法将watcher监听器保存进去,在通过inBackground方法将刚刚创建得BackgroundCallback回调保存
实际逻辑则在forPath方法里面,这个因为是后台请求,我们直接看processBackgroundOperation方法,这里得话会创建一个OperationAndData类,将自己作为operation传递进去
这里得话实际就是调用OperationAndData类得callPerformBackgroundOperation方法,而这个方法其实就是调用刚刚传递进来得GetChildrenBuilderImpl得performBackgroundOperation方法
简要说明就是forPath方法会调用performBackgroundOperation方法,这个方法会调用zk原生得api给他一个Watcher监听器,zk如果有子节点发生事件会通知原生得Watcher反过来调用我们注册得listener;