zookeeper Watcher ZK狀態 事件型別
Watcher ZK狀態 事件型別
zookeeper有Watch事件,是一次性出發的,當watch 監視的資料發生變化時,通知設定了該watch的client,即Watcher
同樣,其Watcher事監聽資料傳送了某些變化,那就一定會有對應的事件型別和狀態型別
事件型別:(znode節點相關)
EventType.NodeCreated
EventType.NodeDateChanged
EventType.NodeChildrenchanged
EventType.NodeDeleted
狀態型別:(是跟客戶端例項相關的) Flow 與 Leader Watcher
KeeperState:Disconnected
KeeperState:SyncConnected
KeeperState:AuthFailed
KeeperState:Expired
c1 c2 相當於client 通過建立一個執行緒watch 事件監聽 zookeeper節點的變化 所以C1 C2 相當於 Watcher ,而且client端可以有多個Watcher 一個Watcher監控一個節點,但Watch事件,是一次性出發的,如果一直監控節點的話 要重複的進行watch。
下面我們通過程式碼來看一下:
/** * Zookeeper Wathcher * 本類就是一個Watcher類(實現了org.apache.zookeeper.Watcher類) */ public class ZooKeeperWatcher implements Watcher { /** 定義原子變數 */ AtomicInteger seq = new AtomicInteger(); /** 定義session失效時間 */ private static final int SESSION_TIMEOUT = 10000; /** zookeeper伺服器地址 */ private static final String CONNECTION_ADDR = "192.168.80.88:2181"; /** zk父路徑設定 */ private static final String PARENT_PATH = "/testWatch"; /** zk子路徑設定 */ private static final String CHILDREN_PATH = "/testWatch/children"; /** 進入標識 */ private static final String LOG_PREFIX_OF_MAIN = "【Main】"; /** zk變數 */ private ZooKeeper zk = null; /** 訊號量設定,用於等待zookeeper連線建立之後 通知阻塞程式繼續向下執行 */ private CountDownLatch connectedSemaphore = new CountDownLatch(1); /** * 建立ZK連線 * @param connectAddr ZK伺服器地址列表 * @param sessionTimeout Session超時時間 */ public void createConnection(String connectAddr, int sessionTimeout) { this.releaseConnection(); try { zk = new ZooKeeper(connectAddr, sessionTimeout, this); System.out.println(LOG_PREFIX_OF_MAIN + "開始連線ZK伺服器"); connectedSemaphore.await(); } catch (Exception e) { e.printStackTrace(); } } /** * 關閉ZK連線 */ public void releaseConnection() { if (this.zk != null) { try { this.zk.close(); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 建立節點 * @param path 節點路徑 * @param data 資料內容 * @return */ public boolean createPath(String path, String data) { try { //設定監控(由於zookeeper的監控都是一次性的所以 每次必須設定監控) this.zk.exists(path, true); System.out.println(LOG_PREFIX_OF_MAIN + "節點建立成功, Path: " + this.zk.create( /**路徑*/ path, /**資料*/ data.getBytes(), /**所有可見*/ Ids.OPEN_ACL_UNSAFE, /**永久儲存*/ CreateMode.PERSISTENT ) + ", content: " + data); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 讀取指定節點資料內容 * @param path 節點路徑 * @return */ public String readData(String path, boolean needWatch) { try { return new String(this.zk.getData(path, needWatch, null)); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 更新指定節點資料內容 * @param path 節點路徑 * @param data 資料內容 * @return */ public boolean writeData(String path, String data) { try { System.out.println(LOG_PREFIX_OF_MAIN + "更新資料成功,path:" + path + ", stat: " + this.zk.setData(path, data.getBytes(), -1)); } catch (Exception e) { e.printStackTrace(); } return false; } /** * 刪除指定節點 * * @param path * 節點path */ public void deleteNode(String path) { try { this.zk.delete(path, -1); System.out.println(LOG_PREFIX_OF_MAIN + "刪除節點成功,path:" + path); } catch (Exception e) { e.printStackTrace(); } } /** * 判斷指定節點是否存在 * @param path 節點路徑 */ public Stat exists(String path, boolean needWatch) { try { return this.zk.exists(path, needWatch); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 獲取子節點 * @param path 節點路徑 */ private List<String> getChildren(String path, boolean needWatch) { try { return this.zk.getChildren(path, needWatch); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 刪除所有節點 */ public void deleteAllTestPath() { if(this.exists(CHILDREN_PATH, false) != null){ this.deleteNode(CHILDREN_PATH); } if(this.exists(PARENT_PATH, false) != null){ this.deleteNode(PARENT_PATH); } } /** * 收到來自Server的Watcher通知後的處理。 */ @Override public void process(WatchedEvent event) { System.out.println("進入 process 。。。。。event = " + event); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } if (event == null) { return; } // 連線狀態 KeeperState keeperState = event.getState(); // 事件型別 EventType eventType = event.getType(); // 受影響的path String path = event.getPath(); String logPrefix = "【Watcher-" + this.seq.incrementAndGet() + "】"; System.out.println(logPrefix + "收到Watcher通知"); System.out.println(logPrefix + "連線狀態:\t" + keeperState.toString()); System.out.println(logPrefix + "事件型別:\t" + eventType.toString()); if (KeeperState.SyncConnected == keeperState) { // 成功連線上ZK伺服器 if (EventType.None == eventType) { System.out.println(logPrefix + "成功連線上ZK伺服器"); connectedSemaphore.countDown(); } //建立節點 else if (EventType.NodeCreated == eventType) { System.out.println(logPrefix + "節點建立"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.exists(path, true); } //更新節點 else if (EventType.NodeDataChanged == eventType) { System.out.println(logPrefix + "節點資料更新"); System.out.println("我看看走不走這裡........"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(logPrefix + "資料內容: " + this.readData(PARENT_PATH, true)); } //更新子節點 else if (EventType.NodeChildrenChanged == eventType) { System.out.println(logPrefix + "子節點變更"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(logPrefix + "子節點列表:" + this.getChildren(PARENT_PATH, true)); } //刪除節點 else if (EventType.NodeDeleted == eventType) { System.out.println(logPrefix + "節點 " + path + " 被刪除"); } else ; } else if (KeeperState.Disconnected == keeperState) { System.out.println(logPrefix + "與ZK伺服器斷開連線"); } else if (KeeperState.AuthFailed == keeperState) { System.out.println(logPrefix + "許可權檢查失敗"); } else if (KeeperState.Expired == keeperState) { System.out.println(logPrefix + "會話失效"); } else ; System.out.println("--------------------------------------------"); } /** * <B>方法名稱:</B>測試zookeeper監控<BR> * <B>概要說明:</B>主要測試watch功能<BR> * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //建立watcher ZooKeeperWatcher zkWatch = new ZooKeeperWatcher(); //建立連線 zkWatch.createConnection(CONNECTION_ADDR, SESSION_TIMEOUT); //System.out.println(zkWatch.zk.toString()); Thread.sleep(1000); // 清理節點 zkWatch.deleteAllTestPath(); if (zkWatch.createPath(PARENT_PATH, System.currentTimeMillis() + "")) { Thread.sleep(1000); // 讀取資料 System.out.println("---------------------- read parent ----------------------------"); //zkWatch.readData(PARENT_PATH, true); // 讀取子節點 System.out.println("---------------------- read children path ----------------------------"); zkWatch.getChildren(PARENT_PATH, true); // 更新資料 zkWatch.writeData(PARENT_PATH, System.currentTimeMillis() + ""); Thread.sleep(1000); // 建立子節點 zkWatch.createPath(CHILDREN_PATH, System.currentTimeMillis() + ""); Thread.sleep(1000); zkWatch.writeData(CHILDREN_PATH, System.currentTimeMillis() + ""); } Thread.sleep(50000); // 清理節點 zkWatch.deleteAllTestPath(); Thread.sleep(1000); zkWatch.releaseConnection(); } }
相關推薦
zookeeper Watcher ZK狀態 事件型別
Watcher ZK狀態 事件型別 zookeeper有Watch事件,是一次性出發的,當watch 監視的資料發生變化時,通知設定了該watch的client,即Watcher 同樣,其Watcher事監聽資料傳送了某些變化,那就一定會有對應的事件型別和狀態型別
Java架構學習(四十二)Zookeeper基礎&ZK概述&ZK資料結構&windows搭建ZK&Java操作ZK&ZK建立臨時節點&ZK的Watcher事件通知&架構面試
一、Zookeeper概述 1、什麼是Zookeeper? 答:Zookeeper是分散式開源框架,是分散式協調工具。 2、應用場景: 答:dubbo 是rpc遠端呼叫框架+Zookeeper作為註冊中心,(命名服務) 釋出訂閱 --- wathcher 對z
Watcher事件型別(二)
ls為父節點設定watcher,建立子節點觸發:NodeChild [zk: localhost:2181(CONNECTED) 29] ls / [imocc, zookeeper] [zk: localhost:2181(CONNECTED) 31] ls /imo
Watcher事件型別(一)
建立父節點觸發:NodeCreated [zk: localhost:2181(CONNECTED) 16] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 17] stat /imooc watch Node does
java.lang.NoClassDefFoundError: org/apache/zookeeper/Watcher$Event$KeeperState
create col cycle eve apach sport fig depend frame 七月 29, 2017 10:51:00 上午 org.apache.catalina.core.StandardContext listenerStart嚴重: Excep
用shell腳本查看zookeeper集群狀態
zopper shellzooper集群結構:主機名 角色node1 followernode2 leadernode3 followermaster observer腳本內容:#!/bin/bashfunction getstatus(){#定義一個函數
zookeeper-Watcher
create nod RoCE 客戶 public pub oid child .com zookeeper的客戶端會從它連接的服務端接收到各種消息,通過註冊實現Watcher接口就可以來處理這些事件。 類圖結構 Watcher 消息處理接口。 public
Zookeeper-watcher機制源碼分析(一)
exc class sso referer 告訴 resp sessionid chm 同學 Watcher的基本流程 ZooKeeper 的 Watcher 機制,總的來說可以分為三個過程:客戶端註冊 Watcher、服務器處理 Watcher 和客戶端回調 Watche
ZooKeeper Watcher
客戶端 包含 事件 eve 客戶端設置 類型 ffffff 才會 訂閱者 ZooKeeper 提供了分布式數據發布/訂閱功能,一個典型的發布/訂閱模型系統定義了一種一對多的訂閱關系,能讓多個訂閱者同時監聽某一個主題對象,當這個主題對象自身狀態變化時,會通知所有訂閱者,使他們
libVLC 事件型別
Event Type Enumerator libvlc_MediaMetaChanged Metadata of a media item changed. libvl
事件型別
1、表單事件: submit事件 reset事件 click事件 change事件 focus事件(不冒泡) (IE和ES5支援冒泡的focusin) blur事件(不冒泡) (IE和ES5支援冒泡的focusout) input事件(ES5 textinput提供更方便的獲取輸入文字的方案)
ZooKeeper Watcher監聽機制(資料變更的通知)(二)(分析)
緊接著上一篇部落格:https://blog.csdn.net/Dongguabai/article/details/82970852 在輸出內容中有這樣兩個結果: 在ZooKeeper中,介面類Watcher用於表示一個標準的事件處理器,其定義了事件通知相關的邏輯,包含Ke
應該在同一個Kafka主題中放入幾種事件型別嗎?
採用Apache Kafka等流平臺,有個很重要的問題是:將使用哪些主題?特別是,如果要將一堆不同的事件作為訊息釋出到Kafka,是將它們放在同一主題中,還是將它們拆分為不同的主題? 主題最重要的功能是允許使用者指定它想要使用的訊息子集。在一個極端情況下,所有資料都放在一個主題中可不是一個好主意,因為這意味
tk中的事件型別
The sequence argument specifies a sequence of one or more event patterns, with optional white space between the patterns. Each event pat
JavaScript之事件型別
事件型別 Web瀏覽器中可能發生的事件有很多型別。DOM3事件規定了以下幾類事件: UI事件,當用戶與頁面上的元素互動時觸發; 焦點事件,當元素獲得或失去焦點的時觸發; 滑鼠事件,當用戶通過滑鼠在頁面上執行操作時觸發; 滾輪事件,當用戶通過滑鼠滾輪或類似裝置時
zookeeper叢集環境搭建(使用kafka的zookeeper搭建zk叢集)
---恢復內容開始--- 使用kafka的zookeeper來搞叢集的話和單純用zk的其實差不了多少。 0.說在前頭,搭建kafka叢集之前請把每個伺服器的jdk搞起來。 1.安裝kafka wget http://mirrors.hust.edu.cn/apache/kafka/2.0.0/kafk
《Javascript 高階程式設計(第三版)》筆記0x18 事件:事件型別
目錄 事件型別 UI事件 load 事件 unload 事件 resize 事件
jQuery事件型別
jQuery事件 事件驅動:目的是將一個事件內容傳遞給另一個事件內容,傳遞的是私有區域性資料,各個事件相互獨立,所以事件可刪除和新增,不會相互影響。注入資料用set、get。 注入式驅動:AJAX將資料注入到大介面,然後大介面再注入給模組,模組再注入給事件。
javascript 的 事件型別(事件) JavaScript中常用的事件
事件通常與函式配合使用,這樣就可以通過發生的事件來驅動函式執行。 事件是文件或者瀏覽器視窗中發生的,特定的互動瞬間。 事件是使用者或瀏覽器自身執行的某種動作,如click,load和mouseover都是事件的名字。 事件是javaScript和DOM之間互動的橋樑。 你若觸發,我便執行——事件發生,
ZooKeeper Watcher執行順序 ********************
有如下三個wathcer zk.extist(rootpath+childpath,new ExistWater()) zk.getData(rootpath+childpath,new DataWatcher()); zk.getChildren(rootpath,ne