1java
/* 1 connectString: zk服務端的地址和端口,用,分割;可選添加路徑前綴;鏈接時是隨機選擇地址鏈接 2 sessionTimeout:會話週期,單位是毫秒;客戶端和服務端經過心跳檢測會話的有效性 3 wachter:鏈接是異步的。對象會馬上返回,但並未鏈接成功。鏈接成功,狀態改變,會通知watcher 4 canBeReadOnly:當客戶端失去大部分zk servers的網絡鏈接,但仍能鏈接部分server,是否提供只讀服務(不可能提供寫 服務) 5 aHostProvider: 隨機提供host進行鏈接。不關注,默認的便可。 6 clientConfig : 能夠設置鏈接參數。 */ public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly, HostProvider aHostProvider, ZKClientConfig clientConfig) throws IOException { LOG.info("Initiating client connection, connectString=" + connectString + " sessionTimeout=" + sessionTimeout + " watcher=" + watcher); if (clientConfig == null) { clientConfig = new ZKClientConfig(); } this.clientConfig = clientConfig; watchManager = defaultWatchManager(); watchManager.defaultWatcher = watcher; ConnectStringParser connectStringParser = new ConnectStringParser( connectString); hostProvider = aHostProvider; cnxn = new ClientCnxn(connectStringParser.getChrootPath(), hostProvider, sessionTimeout, this, watchManager, getClientCnxnSocket(), canBeReadOnly); cnxn.start(); }
由於鏈接是異步的,所以在使用客戶端時,要保證已鏈接成功。網絡
//若是已知會話id和密碼,能夠複用以前的鏈接 public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly, HostProvider aHostProvider) throws IOException { LOG.info("Initiating client connection, connectString=" + connectString + " sessionTimeout=" + sessionTimeout + " watcher=" + watcher + " sessionId=" + Long.toHexString(sessionId) + " sessionPasswd=" + (sessionPasswd == null ? "<null>" : "<hidden>")); this.clientConfig = new ZKClientConfig(); watchManager = defaultWatchManager(); watchManager.defaultWatcher = watcher; ConnectStringParser connectStringParser = new ConnectStringParser( connectString); hostProvider = aHostProvider; cnxn = new ClientCnxn(connectStringParser.getChrootPath(), hostProvider, sessionTimeout, this, watchManager, getClientCnxnSocket(), sessionId, sessionPasswd, canBeReadOnly); cnxn.seenRwServerBefore = true; // since user has provided sessionId cnxn.start(); }