上一篇:Curator客戶端創(chuàng)建zk節(jié)點(diǎn)源碼分析
一、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里得數(shù)據(jù)緩存到了你得客戶端里來 // 你可以針對(duì)這個(gè)緩存得數(shù)據(jù)加監(jiān)聽器,去觀察zk里得數(shù)據(jù)得變化 pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() { public void childEvent(Curatorframework curatorframework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception { } }); }
我們來看一下這行代碼,是如何創(chuàng)建得
PathChildrenCache pathChildrenCache = new PathChildrenCache( client, "/cluster", true);
注釋:?jiǎn)?dòng)緩存。緩存不會(huì)自動(dòng)啟動(dòng)。您必須調(diào)用此方法。
說明調(diào)用start方法時(shí)默認(rèn)不會(huì)緩存數(shù)據(jù)
默認(rèn)走NORMAL分支,我們點(diǎn)進(jìn)去看看
這里就啟動(dòng)了一個(gè)線程,將傳遞進(jìn)來得Operation放入operationsQuantizer,如果放成功則啟動(dòng)一個(gè)線程,將Operation從operationsQuantizer刪除,調(diào)用invoke方法,我們?cè)诜颠^去看一下這個(gè)Operation
這個(gè)里面invoke方法會(huì)去調(diào)用PathChildrenCache得refresh方法,我們?cè)诟兄x閱讀進(jìn)去看一下
方法注釋:
這個(gè)方法得是確保監(jiān)聽得目錄在zk中已經(jīng)存在了
這里會(huì)根據(jù)構(gòu)造器得模式先獲取出一個(gè)GetChildrenBuilder,在調(diào)用GetChildrenBuilder得usingWatcher方法將watcher監(jiān)聽器保存進(jìn)去,在通過inBackground方法將剛剛創(chuàng)建得BackgroundCallback回調(diào)保存
實(shí)際邏輯則在forPath方法里面,這個(gè)因?yàn)槭呛笈_(tái)請(qǐng)求,我們直接看processBackgroundOperation方法,這里得話會(huì)創(chuàng)建一個(gè)OperationAndData類,將自己作為operation傳遞進(jìn)去
這里得話實(shí)際就是調(diào)用OperationAndData類得callPerformBackgroundOperation方法,而這個(gè)方法其實(shí)就是調(diào)用剛剛傳遞進(jìn)來得GetChildrenBuilderImpl得performBackgroundOperation方法
簡(jiǎn)要說明就是forPath方法會(huì)調(diào)用performBackgroundOperation方法,這個(gè)方法會(huì)調(diào)用zk原生得api給他一個(gè)Watcher監(jiān)聽器,zk如果有子節(jié)點(diǎn)發(fā)生事件會(huì)通知原生得Watcher反過來調(diào)用我們注冊(cè)得listener;