博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zookeeper的RPC框架
阅读量:7030 次
发布时间:2019-06-28

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

org.apache.zookeeper.ClientCnxn.java

该类管理客户端到HBase集群的socket I/O

所有需要通过socket发送的消息全部打包成Packet对象,然后放到ClentCnxn的outgoingQueue(LinkedList<Packet>)中,对outgoingQueue的操作需要同步控制。需要接受的消息也会被打包成Packet对象,放入pendingQueue(LinkedList<Packet>)中,等待一个答复。下面介绍一下设计的其他类及各类的使用方法及处理逻辑。

(一)Packet.java

 

static class Packet {        RequestHeader header;        ByteBuffer bb;        /** Client's view of the path (may differ due to chroot) **/        String clientPath;        /** Servers's view of the path (may differ due to chroot) **/        String serverPath;        ReplyHeader replyHeader;        Record request;        Record response;        boolean finished;        AsyncCallback cb;        Object ctx;        WatchRegistration watchRegistration;        Packet(RequestHeader header, ReplyHeader replyHeader, Record record,                Record response, ByteBuffer bb,                WatchRegistration watchRegistration) {            this.header = header;            this.replyHeader = replyHeader;            this.request = record;            this.response = response;            if (bb != null) {                this.bb = bb;            } else {                try {                    ByteArrayOutputStream baos = new ByteArrayOutputStream();                    BinaryOutputArchive boa = BinaryOutputArchive                            .getArchive(baos);                    boa.writeInt(-1, "len"); // We'll fill this in later                    header.serialize(boa, "header");                    if (record != null) {                        record.serialize(boa, "request");                    }                    baos.close();                    this.bb = ByteBuffer.wrap(baos.toByteArray());                    this.bb.putInt(this.bb.capacity() - 4);                    this.bb.rewind();                } catch (IOException e) {                    LOG.warn("Ignoring unexpected exception", e);                }            }            this.watchRegistration = watchRegistration;        }        @Override        public String toString() {            StringBuilder sb = new StringBuilder();            sb.append("clientPath:" + clientPath);            sb.append(" serverPath:" + serverPath);            sb.append(" finished:" + finished);            sb.append(" header:: " + header);            sb.append(" replyHeader:: " + replyHeader);            sb.append(" request:: " + request);            sb.append(" response:: " + response);            // jute toString is horrible, remove unnecessary newlines            return sb.toString().replaceAll("\r*\n+", " ");        }    }

 

  

 

 该类含多个成员变量,主要的逻辑集中在构造函数中,若传入的字节数组(bb)内容非空,就将输入的"请求头(RequestHeader)"和“请求内容”(如:ExistRequest)转换成字节数组放入ByteBuffer中。其toString()方法将所有的字段输出,并最后替换掉回车与换行之间的部分成空格。

1)RequestHeader.java

 

在RequestHeader中有两个整型变量,Xid和type,type标志着操作类型,如:ping,auth,详见OpCode接口中的静态常量。

 

Xid是一个操作序号,针对非ping和auth的操作,对于特定的ClientCnxn每次都会将该序号加1,然后传递给RequestHeader。

2)ReplyHeader extends record

 在PendingQueue接收返回数据,

3)Request extends record

记录请求内容

4)Response extends record

 记录回应内容

 

 

转载于:https://www.cnblogs.com/legendary/archive/2012/10/09/2717266.html

你可能感兴趣的文章
illuminate/routing 源码分析之注册路由
查看>>
网易公共技术Java研发工程师面经(offer)
查看>>
说说如何在登录页实现生成验证码功能
查看>>
笔记-softmax、softmax loss
查看>>
FastDFS蛋疼的集群和负载均衡(六)之Nginx高可用集群
查看>>
C语言入门经典读书笔记----第十一章 结构化数据
查看>>
Apache Thrift系列详解(二) - 网络服务模型
查看>>
chrome devtools使用详解——Performance
查看>>
了解一下ES6: 解构赋值&字符串
查看>>
7 - 在 Django Admin 后台发布文章
查看>>
SpringBoot+Mybatis+ Druid+PageHelper 实现多数据源并分页
查看>>
Umeng第三方登录
查看>>
EggBorn.js:一款顶级Javascript全栈开发框架
查看>>
前端开始的那件事——表单
查看>>
【前端】HTML属性
查看>>
js 算法3
查看>>
【Java 容器面试题】谈谈你对HashMap 的理解
查看>>
分组圆角TableView
查看>>
高级Java研发者在解决大数据问题上的一些技巧
查看>>
用 Node 开发一个命令行版本词典--不到十行的代码
查看>>