06_zookeeper原生Java API使用
阿新 • • 發佈:2018-09-20
edev 集群 err main .com 連接狀態 com 通知 bool
【Zookeeper構造方法概述】
/** * 客戶端和zk服務端的連接是一個異步的過程 * 當連接成功後,客戶端會收到一個watch通知 * * ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, * long sessionId, byte[] sessionPasswd, boolean canBeReadOnly) * 參數介紹 * connectString:連接服務器的ip字符串 * 比如:"192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181" * 可以是一個ip,也可以是多個ip,一個ip代表單機,多個ip代表集群 * 也可以在ip後加路徑 * sessionTimeout:超時時間,心跳收不到了,那就超時 * watcher:通知事件,如果有對應的事件觸發,則會收到一個通知:如果不需要,那就設為null * sessionId:會話的id * sessionPasswd:會話密碼,當會話丟失後,可以依據sessionId和sessionPasswd重新獲取會話 * canBeReadOnly:可讀,當這個物理機節點斷開後,還是可以讀到數據的,只是不能寫, * 此時數據被讀取到的可能是舊數據,一般設置為false,不推薦使用 **/ public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)
【Zookeeper API 客戶端連接服務端例子】
package com.zk.demo; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper;/** * Created by HigginCui on 2018/9/20. */ public class ZkConnect implements Watcher{ public static final String zkServerPath = "127.0.0.1:2181"; public static final Integer timeout = 5000; /** * 客戶端和zk服務端的連接是一個異步的過程 * 當連接成功後,客戶端會收到一個watch通知 */ public static voidmain(String[] args) throws Exception{ ZooKeeper zk = new ZooKeeper(zkServerPath,timeout,new ZkConnect()); for (int i=0;i<20;i++) { Thread.sleep(10); //休眠10ms,在這個過程中,連接狀態會從CONNECTING--->CONNECTED System.out.println(i+"---"+zk.getState()); } } @Override public void process(WatchedEvent watchedEvent) { System.err.println("收到zk的watch通知----" ); } }
【運行結果】
【使用CountDownLatch優化zk連接過程】
package com.zk.demo; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import java.util.concurrent.CountDownLatch; public class ZkConnect implements Watcher{ public static final String zkServerPath = "127.0.0.1:2181"; public static final Integer timeout = 5000; private static CountDownLatch latch = new CountDownLatch(1); public static void main(String[] args) throws Exception{ ZooKeeper zk = new ZooKeeper(zkServerPath,timeout,new ZkConnect()); System.out.println("連接狀態---" + zk.getState()); latch.await(); System.out.println("連接狀態---" + zk.getState()); } @Override public void process(WatchedEvent watchedEvent) { System.err.println("收到zk的watch通知----" ); latch.countDown(); } }
【運行結果】
06_zookeeper原生Java API使用