原生的zookeeper的監聽API所實現的方法存在一些缺點,對於開發者來說后續的開發會考慮的細節比較多。
Curator所實現的方法希望摒棄原聲API 的不足,是開發看起來更加的簡單,一些重連等操作對開發者變成了透明操作,而不需要去考慮。
1. Curator的監聽API
Curator的監聽實現是對zookeeper原生監聽方法的高級封裝,主要體現在兩點:監聽重復注冊,事件發生信息。而且監聽事件返回詳細的信息,如變動的節點信息,節點的value等。
Curator 提供了3個接口,包含在org.apache.curator.framework.recipes.cache下(點擊超鏈接可查看對應的javadoc)
如圖所示:
1) NodeCache: 對一個節點進行監聽,監聽事件包括指定的路徑節點的增、刪、改的操作。
2) PathChildrenCache: 對指定的路徑節點的一級子目錄進行監聽,不對該節點的操作進行監聽,對其子目錄的節點進行增、刪、改的操作監聽
3) TreeCache: 可以將指定的路徑節點作為根節點(祖先節點),對其所有的子節點操作進行監聽,呈現樹形目錄的監聽,可以設置監聽深度,最大監聽深度為2147483647(int類型的最大值)。
2. NodeCache
Node Cache - A utility that attempts to keep the data from a node locally cached. This class will watch the node, respond to update/create/delete events, pull down the data, etc. You can register a listener that will get notified when changes occur. (官網)
部分樣例代碼
NodeCache nodeCache = null;
nodeCache.start(true);
// 如果為true則首次不會緩存節點內容到cache中,默認為false,設置為true首次不會觸發監聽事件
nodeCache.getListenable().addListener(new NodeCacheListener(){ @Override public void nodeChanged() throws Exception { // 節點發生變化,回調方法 byte[] ret = nodeCache.getCurrentData().getData(); // getData()方法實現返回byte[] System.out.println("數據發生變化: " + new String(ret)); } });
說明:
/* * 節點路徑不存在,set不觸發監聽 * 節點路徑不存在,創建事件觸發監聽(第一次創建時要觸發) * 節點路徑存在,set觸發監聽(改操作觸發) * 節點路徑存在,delete觸發監聽(刪操作觸發) * * 節點掛掉,未觸發任何監聽 * 節點重連,未觸發任何監聽 * 節點重連 ,恢復監聽 * */
2. PathChildrenCache
Path Cache - A Path Cache is used to watch a ZNode. Whenever a child is added, updated or removed, the Path Cache will change its state to contain the current set of children, the children's data and the children's state. Path caches in the Curator Framework are provided by the PathChildrenCache class. Changes to the path are passed to registered PathChildrenCacheListener instances.(官網)
部分樣例代碼:
PathChildrenCache pathChildrenCache = null; pathChildrenCache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE); pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener(){ @Override public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { // switch(event.getType()) { case CHILD_ADDED: System.out.println("添加了兒子節點 " + event.getData()); break; case CHILD_UPDATED: System.out.println("兒子節點發生了更新 " + event.getData()); break; case CHILD_REMOVED: System.out.println("兒子節點移除 " + event.getData()); case CONNECTION_SUSPENDED: break; // ZK掛掉 case CONNECTION_RECONNECTED: break; // 重新啟動ZK case CONNECTION_LOST: break; // ZK掛掉一段時間后 case INITIALIZED: break; default: break; } } });
說明:
/** * 注冊監聽器,當前節點不存在,創建該節點:未拋出異常及錯誤日志 * 注冊子節點觸發type=[CHILD_ADDED] * 更新觸發type=[CHILD_UPDATED] * * zk掛掉type=CONNECTION_SUSPENDED,,一段時間后type=CONNECTION_LOST * 重啟zk:type=CONNECTION_RECONNECTED, data=null * 更新子節點:type=CHILD_UPDATED, data=ChildData{path='/zktest111/tt1', stat=4294979983,4294979993,1501037475236,1501037733805,2,0,0,0,6,0,4294979983 ,data=[55, 55, 55, 55, 55, 55]} * 刪除子節點type=CHILD_REMOVED * 更新根節點:不觸發 * 刪除根節點:不觸發 無異常 * 創建根節點:不觸發 * 再創建及更新子節點不觸發 * * 重啟時,與zk連接失敗 */
3. TreeCache
Tree Cache - A utility that attempts to keep all data from all children of a ZK path locally cached. This class will watch the ZK path, respond to update/create/delete events, pull down the data, etc. You can register a listener that will get notified when changes occur.(官網)
部分樣例代碼:
TreeCache treeCache = null; treeCache.start(); // 沒有開啟模式作為入參的方法 treeCache.getListenable().addListener(new TreeCacheListener(){ @Override public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception { // switch(event.getType()) { case NODE_ADDED: System.out.println("tree:發生節點添加" + event.getData().toString() ); break; case NODE_UPDATED: System.out.println("tree:發生節點更新"); break; case NODE_REMOVED: System.out.println("tree:發生節點刪除"); break; case CONNECTION_SUSPENDED: break; case CONNECTION_RECONNECTED: break; case CONNECTION_LOST: break; case INITIALIZED: System.out.println("初始化的操作"); break; default: break; } } });
說明:
/** * TreeCache.nodeState == LIVE的時候,才能執行getCurrentChildren非空,默認為PENDING * 初始化完成之后,監聽節點操作時 TreeCache.nodeState == LIVE * * maxDepth值設置說明,比如當前監聽節點/t1,目錄最深為/t1/t2/t3/t4,則maxDepth=3,說明下面3級子目錄全 * 監聽,即監聽到t4,如果為2,則監聽到t3,對t3的子節點操作不再觸發 * maxDepth最大值2147483647 * * 初次開啟監聽器會把當前節點及所有子目錄節點,觸發[type=NODE_ADDED]事件添加所有節點(小等於maxDepth目錄) * 默認監聽深度至最低層 * 初始化以[type=INITIALIZED]結束 * * [type=NODE_UPDATED],set更新節點值操作,范圍[當前節點,maxDepth目錄節點](閉區間) * * * [type=NODE_ADDED] 增加節點 范圍[當前節點,maxDepth目錄節點](左閉右閉區間) * * [type=NODE_REMOVED] 刪除節點, 范圍[當前節點, maxDepth目錄節點](閉區間),刪除當前節點無異常 * * 事件信息 * TreeCacheEvent{type=NODE_ADDED, data=ChildData{path='/zktest1', stat=4294979373,4294979373,1499850881635,1499850881635,0,0,0,0,2,0,4294979373 , data=[116, 49]}} * */