監(jiān)聽器前言
- 本人使用 curator 版本 5+ ,對此版本的監(jiān)聽器做一下小結(jié)
- 網(wǎng)上搜索 Zookeeper 的 curator 監(jiān)聽器,大概率會出現(xiàn)一下 3 種監(jiān)聽器
-
NodeCache:只是監(jiān)聽某一特定節(jié)點(diǎn)的數(shù)據(jù)更新、新增、刪除- 節(jié)點(diǎn)不存在也可以添加監(jiān)聽器
-
PathChildrenCache:監(jiān)聽節(jié)點(diǎn)的子節(jié)點(diǎn)。當(dāng)子節(jié)點(diǎn)增加、更新、刪除時,PathCache會改變它的狀態(tài)。保存子節(jié)點(diǎn),數(shù)據(jù)、狀態(tài) TreeCache
-
- 使用 curator 版本 5+ 時,發(fā)現(xiàn)這些監(jiān)聽器已被棄用,所以使用以下幾種監(jiān)聽器
- curator 注冊的監(jiān)聽器,不需要考慮 一次性問題
監(jiān)聽器-1
-
可以監(jiān)聽當(dāng)前節(jié)點(diǎn)和子節(jié)點(diǎn)(子節(jié)點(diǎn)的子節(jié)點(diǎn))的創(chuàng)建、更新、刪除
-
事件
NODE_CREATED // 節(jié)點(diǎn)創(chuàng)建 NODE_CHANGED // 節(jié)點(diǎn)更新 NODE_DELETED // 節(jié)點(diǎn)刪除 NODE_CREATEE事件,節(jié)點(diǎn)創(chuàng)建會被觸發(fā);監(jiān)聽器第一次執(zhí)行時節(jié)點(diǎn)存在也會觸發(fā)次事件
-
-
使用實例介紹
-
如下
CuratorCache curatorCache = CuratorCache.build(client, "/watcher"); curatorCache.listenable().addListener(new CuratorCacheListener() { @Override public void event(Type type, ChildData childData, ChildData childData1) { if (type.name().equals("NODE_CREATED")) { //--節(jié)點(diǎn)創(chuàng)建--// //--第二個參數(shù)為null--// } else if (type.name().equals("NODE_CHANGED")) { //--更新--// //--節(jié)點(diǎn)第一次賦值,childrenData.getData()為null--// } else { //--刪除--// //--第三個參數(shù)為null--// } } }); //--開啟監(jiān)聽器--// curatorCache.start(); //--關(guān)閉監(jiān)視器--// //curatorCache.close();
-
-
Type type對象是枚舉類型監(jiān)聽事件為:創(chuàng)建、更新、刪除
-
源碼如下
public static enum Type { NODE_CREATED, NODE_CHANGED, NODE_DELETED; private Type() { } }
-
回調(diào)函數(shù)參數(shù)
public void event(Type type, ChildData childData, ChildData childData1)- 第一個參數(shù):事件類型(枚舉)
- 第二個參數(shù):節(jié)點(diǎn)更新前的狀態(tài)、數(shù)據(jù)
- 第三個參數(shù):節(jié)點(diǎn)更新后的狀態(tài)、數(shù)據(jù)
-
回調(diào)函數(shù)使用注意
- 創(chuàng)建節(jié)點(diǎn)時:節(jié)點(diǎn)剛被創(chuàng)建,不存在 更新前節(jié)點(diǎn) ,所以第二個參數(shù)為
null - 刪除節(jié)點(diǎn)時:節(jié)點(diǎn)被刪除,不存在 更新后節(jié)點(diǎn) ,所以第三個參數(shù)為
null - 節(jié)點(diǎn)創(chuàng)建時沒有賦予值
create /curator/watcher只創(chuàng)建節(jié)點(diǎn),在這種情況下,更新前節(jié)點(diǎn) 的data為 null,獲取不到更新前節(jié)點(diǎn)的數(shù)據(jù)
- 創(chuàng)建節(jié)點(diǎn)時:節(jié)點(diǎn)剛被創(chuàng)建,不存在 更新前節(jié)點(diǎn) ,所以第二個參數(shù)為
-
使用案例
-
如下
CuratorCache curatorCache = CuratorCache.build(client, "/watcher"); curatorCache.listenable().addListener(new CuratorCacheListener() { @Override public void event(Type type, ChildData childData, ChildData childData1) { if (type.name().equals("NODE_CREATED")) { System.out.println(childData1.getPath() + " 節(jié)點(diǎn)被創(chuàng)建"); } else if (type.name().equals("NODE_CHANGED")) { System.out.println(type.name() + " 節(jié)點(diǎn)數(shù)據(jù)修改"); System.out.println(childData.getPath()); if (childData.getData() != null) { System.out.println("修改之前數(shù)據(jù)" + new String(childData.getData())); } else { System.out.println("節(jié)點(diǎn)第一次賦值"); } System.out.println("修改之后數(shù)據(jù)" + new String(childData1.getData())); } else { System.out.println(childData.getPath() + " 節(jié)點(diǎn)刪除"); System.out.println(new String(childData.getData())); } } }); curatorCache.start();
-