Zookeeper_zkClientListener讲解
生活随笔
收集整理的這篇文章主要介紹了
Zookeeper_zkClientListener讲解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于zkclient操作zookeeper已經知道了,核心理念就是你操作的時候就是操作,別干別的事,如果你想watcher的時候我給你兩套方式
我們發現,zkclient里面并沒有類似的watcher,watch的概念,就是開發人員無需反復的去注冊watcher,他給我們提供了一套監聽的方式,使用起來非常的easy,就和你MQ里面的listener一樣,怎么去寫呢,就是提供了subscribeChildChanges方法,就是訂閱子節點的變化,這是第一個listener,一個是子節點的變化,一個是數據的變化,就是dataChange,一會咱們再看吧,首先SubscribeChildChanges是通過listener去做的,看看怎么去做的吧,咱們去看代碼吧
package com.learn.zkclient.watcher;import java.util.List;import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;public class ZkClientWatcher1 {/** zookeeper地址 */
// static final String CONNECT_ADDR = "192.168.1.171:2181,192.168.1.172:2181,192.168.1.173:2181";static final String CONNECT_ADDR = "59.110.138.145:2181";/** session超時時間 */static final int SESSION_OUTTIME = 5000;//ms public static void main(String[] args) throws Exception {ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000);//對父節點添加監聽子節點變化。/*** 我連接的時候是這么去做的* 我去監聽我的super* 是所有子節點的一些變化* 那這個時候我就要寫這個方法* 我直接new出來一個listener* * 我這個類所關注的對象* 這個監聽super這下面的子節點* 或者你自己這個節點的新增和刪除* 他不監聽你平級的數據的變化* * 我只監控change節點發生變化* */zkc.subscribeChildChanges("/super", new IZkChildListener() {/*** 你的孩子有變化了你自己應該有知覺* 第一個節點parentPath* 發生變更的節點* 以及currentChilds* 當前變化之后的數據* 這個也是zookeeper非常好的一種方式* 其實你發現沒有* 原生的zookeeper它是不會給你帶返回數據的* 他的watcher就是結果* 他的even只告訴你變化的事件* 就是現在觸發了什么事件* 然后受影響的節點是什么* 他只告訴你這兩件事* 他并沒有告訴你變化的數據是什么* 如果你想取到變化以后的數據的話* 你還需要通過受影響的path去把數據讀取出來* zookeeper原生的為什么要這么去做呢* 我記得這里是有說的* 一次性這里不說了* 客戶端串行執行不說了* 輕量* event原生的API只包括三部分* zookeeper給客戶端返回的內存只有三部分* 通知狀態 事件類型 節點路徑* 變化的節點路徑* 他只告訴你這三個東西* 并不告訴你變化了什么數據* 具體變化了什么數據你得通過路徑去get去取* 為什么人家這么去做呢* 它是為了讓zookeeper的返回的性能更輕更快* 別把變化的key的value也給我帶過來* 這樣的話傳輸value的話就慢了* 他當初設計的理念就是這樣的* 更輕量性能更好* 當然zkclient他實現了這個事情* 他帶來了變化的結果* currentChilds當前變化的child* 然后我就監聽你這個super* * */@Overridepublic void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {System.out.println("parentPath: " + parentPath);System.out.println("currentChilds: " + currentChilds);}});Thread.sleep(3000);/*** 首先create一個super* * 創建的時候觸發了一次* 打印兩句話* parentPath: /super* parentPath肯定是super* currentChilds* child他剛才創建的就沒有孩子* 而且是current肯定是最新的* * */zkc.createPersistent("/super");Thread.sleep(1000);zkc.writeData("/super" , "init");/*** 然后創建super下面創建一個c1* * 我第二次創建c1的時候* 受影響變化的節點還是super* parentPath: /super* 當前我的還是是c1* currentChilds: [c1]* 因為他又創建了* */zkc.createPersistent("/super" + "/" + "c1", "c1內容");Thread.sleep(1000);/*** 建立一個c2* 這都是新添加的節點* * 這回又創建一個c2* currentChilds: [c1, c2]* * */zkc.createPersistent("/super" + "/" + "c2", "c2內容");Thread.sleep(1000); /*** 這里改成新內容覆蓋一下* * 當我去進行write寫操作的時候* 實際的內容給他改了一下* currentChilds: [c1]* c2已經刪除只有一個c1了* * */zkc.writeData("/super" + "/" + "c1", "新內容");/*** c2給他delete掉了* */zkc.delete("/super/c2");Thread.sleep(1000); /*** 然后又把整體給delete掉了* * 遞歸去刪除super下所有的節點* * 為什么是6次* 因為你遞歸的刪除* 下面有一個c1* 當我把/super/c1刪除之后* 我把自己刪除的時候又觸發了一次* 他只監控節點的新增和節點的刪除* 并不監聽任何數據改變的操作* 這是第一個listener* * * */zkc.deleteRecursive("/super");Thread.sleep(Integer.MAX_VALUE);}
}
package com.learn.zkclient.watcher;import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;/*** 人家已經把watcher這個事已經給屏蔽掉了* 提供了兩套API* 一套是節點的個數要么是新增要么是修改* 還有一個接口listener就是對數據的變更* 或者對我本身的刪除* 它是這么去做的* 有沒有發現這個zkclient是不是非常好用的* 你有沒有發現這樣做寫代碼就輕松多了* 但是還不夠完美* 我能不能監聽super下的子節點新增+修改+刪除呢* 有沒有這個API呢* 有* 后面講的curator* 它是更強大的* 分布式鎖* * * @author Leon.Sun**/
public class ZkClientWatcher2 {/** zookeeper地址 */
// static final String CONNECT_ADDR = "192.168.1.171:2181,192.168.1.172:2181,192.168.1.173:2181";static final String CONNECT_ADDR = "59.110.138.145:2181";/** session超時時間 */static final int SESSION_OUTTIME = 5000;//ms public static void main(String[] args) throws Exception {ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000);zkc.createPersistent("/super", "1234");//對父節點添加監聽子節點變化。/*** 叫做訂閱dataChange* 它是發生兩個listener* 子節點的變更他有專門的一個listener* 只要是變更的你就來實現這個* 其實工作中是兩個配合著使用* data change他其實有兩種* * 你要監聽這個change就是super節點發生變化* * 因為這里的change無非就是修改和刪除操作* * */zkc.subscribeDataChanges("/super", new IZkDataListener() {/*** 這個節點刪除* 刪除也會走這個方法* */@Overridepublic void handleDataDeleted(String path) throws Exception {/*** 第二次節點干掉了就打印了這句話* */System.out.println("刪除的節點為:" + path);}/*** 節點數據發生變化也會走這個方法* 這個API有點怪* * 第一次是節點的變更* 打印了這句話* * */@Overridepublic void handleDataChange(String path, Object data) throws Exception {System.out.println("變更的節點為:" + path + ", 變更內容為:" + data);}});Thread.sleep(3000);/*** 然后我這里有一個write和delete* 有這兩個操作* 我這個super剛創建出來是1234* */zkc.writeData("/super", "456", -1);Thread.sleep(1000);/*** 把節點刪除*/zkc.delete("/super");Thread.sleep(Integer.MAX_VALUE);}
}
?
總結
以上是生活随笔為你收集整理的Zookeeper_zkClientListener讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper_zkClientAP
- 下一篇: 类加载机制运行流程