##Watcher接口 實現Watcher的類是一個回調函數,process中實現的方法,會在znode變動的時候觸發html
interface Watcher() { // 不太懂爲啥在Wacher中又定義了一個interface public interface Event(){ public enum EventType{} } abstract public void process(WatcherEvent event){} }
調用zookeeper.create的時候要求傳入權限控制參數(ACL),找了文章發如今UNIX中權限的管理仍是頗有意思的: http://ifeve.com/zookeeper-access-control-using-acls/ 有空能夠繼續研究一下java
##繼續看zookeeper 發如今構造函數的實現中,有兩個Thread。這個就有意思了,爲啥在構造函數中有Thread?能夠繼續追蹤下去node
SendThread sendThread = new SendThread(clientCnxnSocket); ReadThread eventThread = new EventThread();
查閱資料能夠了解到zookeeper實現了一個事件驅動模型,先貼一張圖或許有助於理解:函數
來源http://www.wangjingfeng.com/38.htmlcode
class sendThread { void run() { // 實現NIO // pendingQueue等待響應的packet,outgoingQueue等待發送的packet //int waitTimeOut, List<Packet> pendingQueue, LinkedList<Packet> outgoingQueue,ClientCnxn cnxn clientCnxnSocket.doTransport(waitTimeOut, pendingQueue, outgoingQueue,cnxn){}; } }
###EventThread -> BlockedQueue -> SendThead 經過加鎖固定長度的隊列實現消費者模型,同時sendThread使用了java自帶的NIO技術,每次輪詢全部的selector,處理已經傳輸完成的selector。很好的實現瞭解耦。 ##一些其餘classserver
class ClientCnxn { // ClientCnxn是一個管理I/O的類, 包含了一系列的可用的servers,而且控制這些servers的開關 }
class AuthData { String scheme; byte data[]; }
static class Packet { RequestHeader requestHeader; ReplyHeader replyHeader; Record request; Record response; ByteBuffer bb; AsyncCallBack cb; }
class EventThread { void queueEvent(WatcherEvent watcherEvent){} void queuePacket(Packet packet){} void processEvent(Object event){ WatcherSetEventPair pair = (WatcherSetEventPair) event; watcher = pair.watchers; watcher.process(pair.event); } }
public class ClientCnxnSocketNio{ }