博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zookeeper客户端
阅读量:6547 次
发布时间:2019-06-24

本文共 1125 字,大约阅读时间需要 3 分钟。

hot3.png

线程模型

ClientCnxn是客户端连接服务端的类,它两个内部类SendThread、EventThread

1. sendThread线程负责从与server端建立连接、定时发送心跳消息、从outgoingQueue队列中取得任务,并通过tcp连接将请求发送到server端

2. SendThread类收到server端响应事件后,向waitingEvents队列中addwatcher对象,由EventThread从waitingEvents队列中获取事件,判断事件类型,回调客户端的Watcher实现类WatchRegistration  存放pathwatcher

 看它的线程栈

Exists过程

1. 先把Watcher和Path构造成WatchRegistration(watcher注册器) ,再构造RequestHeader, ExistsRequest和SetDataResponse然后把这几个对象用ClientCnxn方法submitRequest提交;

2. submitRequest里面做的事:上面传过来的参数构造成Packet, 再构造一个ReplyHeader放入Packet中, Packet放入outgoingQueue 这里加了outgoingQueue同步, 返回一个Packet, 然后根据packet.finished循环等待 ;

3. 最后sendThread它里面的ClientCnxnSocketSelector唤醒

4. SendThread run里面把outgoingQueue里面数据往服务端发送

5. SendThread收到服务端数据数据解析成WatchedEvent,调用EventThread的queueEvent, queueEvent会根据类型、路径把watchers来放到WatcherSetEventPair,

WatcherSetEventPair有watchEventSet<Watcher>构成waitingEvents里面存放的就是WatcherSetEventPair所以EventThread run就循环调用这些watcher的process方法。

6. 所以pendingQueue存放请求packet的上面queuePacket加了同步,所有packet是按顺序的 ,到pendingQueue里面第一个packet取出来,把返回的数据解析放到原来的packet中,最后 finish该packet。

转载于:https://my.oschina.net/chengxiaoyuan/blog/680063

你可能感兴趣的文章
怎样实现前端裁剪上传图片功能
查看>>
ffmpeg+SDL2实现的视频播放器「退出、暂停、播放」
查看>>
2011/7/3 第二次评审
查看>>
tar解压
查看>>
Apriori 关联算法学习
查看>>
JSLint的使用
查看>>
HTTP POST GET 本质区别详解
查看>>
MD5加密
查看>>
ant
查看>>
微信,想要说爱你,却没有那么容易!
查看>>
有关sqlite与sql
查看>>
MapXtreme 2005 学习心得 概述(一)
查看>>
php进一法取整、四舍五入取整、忽略小数等的取整数方法大全
查看>>
Hibernate的拦截器和监听器
查看>>
WSDP
查看>>
Memory Management
查看>>
JQUERY 对 表格中的数据重排序
查看>>
程序员常用借口指南
查看>>
awk 常用方法
查看>>
Android网络框架实现之【Retrofit+RxJava】
查看>>