源代码:

http://svn.apache.org/repos/asf/zookeeper/trunk/

导入eclipse:

在包含build.xml目录下执行ant eclipse将产生.classpath文件

目录结构:

src/recipes:提供了各种Zookeeper应用例子

src/c:提供了c版客户端。zookeeper_st,zookeeper_mt两个library

src/contrib:别人贡献的代码?

src/generated:由jute生成的java实体类

客户端入口:org.apache.zookeeper.ZooKeeperMain

//读取命令行输入,用MyCommandOptions解析。

//内部类MyCommandOptions包含成员命令名command、参数列表cmdArgs

-option value –option value command cmdArgs

//根据以上解析的ip、端口,连接到ZooKeeper

zk = newZooKeeper(host,

Integer.parseInt(cl.getOption("timeout")),

newMyWatcher(), readOnly);

//执行命令,在ZooKeeperMain.run()

//ZooKeeperMain只是一个外壳,使用jline实现了命令提示功能。

//commandMapCli将提供的命令命令名与执行体CliCommand关联

//execute from commandMap

CliCommandcliCmd = commandMapCli.get(cmd);

if(cliCmd!=null) {

cliCmd.setZk(zk);

watch =cliCmd.parse(args).exec();

}

//最终转到调用ZooKeeper方法

//提供的命令:

quit:Zk.close()关闭zk连接,调用cnxn.close()

history:列出历史记录

redo index:重新执行历史记录

printwatches [on]:查看/设置watche开关状态

connect:connectToZK(host)连接zk

//ZooKeeper内部连接

cnxn = newClientCnxn(connectStringParser.getChrootPath(),

hostProvider,sessionTimeout,this,watchManager,

getClientCnxnSocket(),canBeReadOnly);

cnxn.start();

ClientCnxn包含SendThread和EventThread两个线程

SendThread将事件添加到waitEvents队列中,EventThread线程消费该队列。

//下面以ls命令为例

//调用zk.getChildren

public boolean exec() throwsKeeperException, InterruptedException {

String path= args[1];

boolean watch =cl.hasOption("w");

List<String> children = zk.getChildren(path, watch);

out.println(children);

return watch;

}

//getChildren生成request

RequestHeader h = newRequestHeader();

h.setType(ZooDefs.OpCode.getChildren);

GetChildrenRequest request = newGetChildrenRequest();

request.setPath(serverPath);

request.setWatch(watcher != null);

GetChildrenResponse response = newGetChildrenResponse();

ReplyHeader r = cnxn.submitRequest(h, request,response, wcb);

//submitRequest调用queuePacket

publicReplyHeadersubmitRequest(RequestHeaderh, Record request,

Recordresponse, WatchRegistration watchRegistration)

throwsInterruptedException {

ReplyHeaderr = new ReplyHeader();

Packetpacket = queuePacket(h,r, request, response,null,null,null,

null, watchRegistration);

synchronized(packet) {

while (!packet.finished) {

packet.wait();

}

}

return r;

}

//queuePacket将Packet添加到outgoingQueue队列中

packet= new Packet(h, r, request, response,watchRegistration);

packet.cb = cb;

packet.ctx = ctx;

packet.clientPath =clientPath;

packet.serverPath =serverPath;

outgoingQueue.add(packet);

//然后唤醒selector

sendThread.getClientCnxnSocket().wakeupCnxn();

//sendThread.run消费outgoingQueue

clientCnxnSocket.doTransport(to,pendingQueue,outgoingQueue,ClientCnxn.this);

//selector判断读/写事件

//doTransport调用doIO,doIO解析Response

//读事件

int rc =sock.read(incomingBuffer);

sendThread.readResponse(incomingBuffer);

//写事件

sock.write(p.bb);

//readResponse在finally块中调用finishPacket,finishPacket将设置packet.finish,

//此时submitRequest返回response。

try {

packet.replyHeader.setXid(replyHdr.getXid());

packet.replyHeader.setErr(replyHdr.getErr());

packet.replyHeader.setZxid(replyHdr.getZxid());

if(replyHdr.getZxid() > 0) {

lastZxid =replyHdr.getZxid();

}

if(packet.response !=null&& replyHdr.getErr() == 0) {

packet.response.deserialize(bbia,"response");

}

} finally {

finishPacket(packet);

}

以下图片转自:http://www.spnguru.com/2010/08/zookeeper%E5%85%A8%E8%A7%A3%E6%9E%90%E2%80%94%E2%80%94client%E7%AB%AF/

ZooKeeper源码阅读(二):客户端的更多相关文章

  1. ZooKeeper源码阅读——client(二)

    原创技术文章,转载请注明:转自http://newliferen.github.io/ 如何连接ZooKeeper集群   要想了解ZooKeeper客户端实现原理,首先需要关注一下客户端的使用方式, ...

  2. Zookeeper 源码(二)序列化组件 Jute

    Zookeeper 源码(二)序列化组件 Jute 一.序列化组件 Jute 对于一个网络通信,首先需要解决的就是对数据的序列化和反序列化处理,在 ZooKeeper 中,使用了Jute 这一序列化组 ...

  3. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  4. xxl-job源码阅读二(服务端)

    1.源码入口 xxl-job-admin是一个简单的springboot工程,简单翻看源码,可以很快发现XxlJobAdminConfig入口. @Override public void after ...

  5. Spring 源码阅读 二

    程序入口: 接着上一篇博客中看完了在AnnotationConfigApplicationContext的构造函数中的register(annotatedClasses);将我们传递进来的主配置类添加 ...

  6. zookeeper源码分析二FASTLEADER选举算法

    如何在zookeeper集群中选举出一个leader,zookeeper使用了三种算法,具体使用哪种算法,在配置文件中是可以配置的,对应的配置项是"electionAlg",其中1 ...

  7. zookeeper 源码(二) session 和 处理事务请求

    问题 session 如何生成的?sessionId为什么不直接使用时间戳+单机名 sessionid 关闭的时候的逻辑,sessionid 的维护是由各节点还是leader ? 会话相关 sessi ...

  8. SparkConf加载与SparkContext创建(源码阅读二)

    紧接着昨天,我们继续开搞了啊.. 1.下面,开始创建BroadcastManager,就是传说中的广播变量管理器.BroadcastManager用于将配置信息和序列化后的RDD.Job以及Shuff ...

  9. JDK源码阅读(二) AbstractList

    package java.util; public abstract class AbstractList<E> extends AbstractCollection<E> i ...

随机推荐

  1. YACC基本用法

    YACC文件格式 yacc文件分为三部分: ... definitions ...(%{}%) %%... rules ...%% ... subroutines ...   定义部分 第一部分包括标 ...

  2. Axure 快捷方式

    基本快捷键: 打开:Ctrl + O新建:Ctrl + N保存:Ctrl + S退出:Alt + F4打印:Ctrl + P查找:Ctrl + F替换:Ctrl + H复制:Ctrl + C剪切:Ct ...

  3. 使用ASP.NET MVC+Entity Framework快速搭建博客系统

    学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和分享. 首先,得确定需求,木有需求的话,那还搞个毛线呀!嗯……大致思考了一下,终于得出如下需求: 1.能自定义 ...

  4. VS2015中使用Git

    10分钟学会在VS2015中使用Git 写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支持.考虑到现在Git很火,作为微 ...

  5. delphi SysErrorMessage 函数和系统错误信息表 good

    在看 API 文档时, 我们经常见到 GetLastError; 它可以返回操作后系统给的提示. 但 GetLastError 返回的只是一个信息代码, 如何返回对应的具体信息呢? FormatMes ...

  6. Codeforces 734F Anton and School(位运算)

    [题目链接] http://codeforces.com/problemset/problem/734/F [题目大意] 给出数列b和数列c,求数列a,如果不存在则输出-1 [题解] 我们发现: bi ...

  7. JD-GUI on Ubuntu 13.04 64-bit

    Java Decompiler (jd-gui) is a cute little tool I like using when working in Java. Unfortunately it o ...

  8. poj1144Network(无向图割点数)

    题目请戳这里 题目大意:给一张无向图,求割点数量. 题目分析:tarjan算法求割点.关于无向图割点,这里说的很清楚了.直接建图跑一遍tarjan算法即可. 详情请见代码: #include < ...

  9. C# 连接 Mysql 中文乱码问题

    网上有很多解决乱码的方法,什么 set names utf8   .什么在插入数据前进行编码,亲自试了都没有效果,在网上寻觅了很久,终于找到一种方法,并亲试成功: 首先要保证你的数据库是UTF8字符集 ...

  10. Android设计中的.9.png

    在Android的设计过程中,为了适配不同的手机分辨率,图片大多需要拉伸或者压缩,这样就出现了可以任意调整大小的一种图片格式“.9.png”.这种图片是用于Android开发的一种特殊的图片格式,它的 ...