標籤:主程 技術 connect 通知 latch current over 執行個體 圖片
建立會話
用戶端可以通過建立一個Zookeeper執行個體來串連伺服器。4種構造方法如下
ZooKeeper(connectString, sessionTimeout, watcher);ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly) ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,long sessionId, byte[] sessionPasswd);ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)
注意,zookeeper用戶端和服務端會話建立是一個非同步過程,也是就是說在程式中構造zookeeper方法初始化方法執行完後
會立即返回,在大多數情況下此時並沒有真正的建立一個可用的會話,此時會話正處於CONnectioning狀態。當真正的會話建立後
服務端會向用戶端發送一個通知,用戶端在擷取這個通知後會話才真正的建立。
package session;import java.io.IOException;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;import org.apache.zookeeper.Watcher.Event.KeeperState;public class CreateZookeeper implements Watcher { private static CountDownLatch connectedSemaphore = new CountDownLatch(1); @Override public void process(WatchedEvent event) { System.out.println("receive watched event:"+event); if (KeeperState.SyncConnected==event.getState()) { connectedSemaphore.countDown(); } } public static void main(String[] args) throws IOException { ZooKeeper zooKeeper = new ZooKeeper("192.168.64.60", 5000, new CreateZookeeper()); System.out.println(zooKeeper.getState()); try { connectedSemaphore.await(); } catch (InterruptedException e) {} System.out.println("zookeeper session established"); } }
程式運行結果如下:
CreateZookeeper類實現了Watcher介面重寫了process方法,該方法負責處理來自zookeeper服務端的通知。在
收到來自服務端的synconncted事件後,解除了主程式中的CountDownLatch等待阻塞。至此用戶端工作階段建立完成。
建立一個複用sessionId和sessionPasswd的執行個體
package session;import java.io.IOException;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;import org.apache.zookeeper.Watcher.Event.KeeperState;public class CreateZookeeper2 implements Watcher {public static CountDownLatch connectedSemaphore = new CountDownLatch(1);@Overridepublic void process(WatchedEvent event) { System.out.println("receive watched event:"+event); if (KeeperState.SyncConnected==event.getState()) { connectedSemaphore.countDown(); } }public static void main(String[] args) throws IOException, InterruptedException { ZooKeeper zooKeeper = new ZooKeeper("192.168.64.60", 5000, new CreateZookeeper()); connectedSemaphore.await(); long sessionId = zooKeeper.getSessionId(); byte[] sessionPasswd = zooKeeper.getSessionPasswd(); //複用sessionId和sessionPasswd zooKeeper = new ZooKeeper("192.168.64.60", 5000, new CreateZookeeper(),1l,"test".getBytes()); zooKeeper = new ZooKeeper("192.168.64.60", 5000, new CreateZookeeper(),sessionId,sessionPasswd); Thread.sleep(Integer.MAX_VALUE);}}
我們可以看出,第一次使用錯誤的id和pw服務端返回“EXpired”事件,而第二次使用正確的id和pw則重新串連上。
讀《分布式一致性原理》JAVA用戶端API操作