线程模型
ClientCnxn是客户端连接服务端的类,它有两个内部类SendThread、EventThread
1. sendThread线程负责从与server端建立连接、定时发送心跳消息、从outgoingQueue队列中取得任务,并通过tcp连接将请求发送到server端
2. SendThread类收到server端响应事件后,向waitingEvents队列中addwatcher对象,由EventThread从waitingEvents队列中获取事件,判断事件类型,回调客户端的Watcher实现类,WatchRegistration 中存放path和watcher
看它的线程栈
Exists过程
1. 先把Watcher和Path构造成WatchRegistration(watcher注册器) ,再构造RequestHeader, ExistsRequest和SetDataResponse,然后把这几个对象用ClientCnxn方法submitRequest提交;
2. submitRequest里面做的事:上面传过来的参数构造成Packet, 再构造一个ReplyHeader放入Packet中, 把Packet放入outgoingQueue中 ,这里加了outgoingQueue同步, 返回一个Packet, 然后根据packet.finished循环等待; ;
3. 最后sendThread把它里面的ClientCnxnSocket的Selector唤醒
4. SendThread run里面把outgoingQueue里面数据往服务端发送
5. SendThread收到服务端数据,把数据解析成WatchedEvent,调用EventThread的queueEvent, queueEvent会根据类型、路径把watchers取出来放到WatcherSetEventPair,
WatcherSetEventPair有watchEvent和Set<Watcher>构成。waitingEvents里面存放的就是WatcherSetEventPair,所以EventThread 的run就是循环调用这些watcher的process方法。
6. 所以pendingQueue是存放请求packet的 , 上面queuePacket加了同步,所有packet是按顺序的 ,到pendingQueue把里面第一个packet取出来,把返回的数据解析放到原来的packet中,最后 finish该packet。