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

本文共 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

你可能感兴趣的文章
框架搭建篇
查看>>
[转] 关于SIGPIPE导致的程序退出
查看>>
字符串的分割??
查看>>
Codeforces Round #566 (Div. 2) B. Plus from Picture
查看>>
Vim常用快捷键
查看>>
CSS3尝鲜(二):用CSS设置多个背景、背景渐变、指定背景大小--孟宪会
查看>>
AFNetworking网络请求数据
查看>>
out.print与out.println
查看>>
生成器,内置函数Ⅰ
查看>>
00.设计模式_软件设计的原则
查看>>
表达式求值 java 修正
查看>>
hosts.allow和hosts.deny文件
查看>>
JavaScript中cookie使用
查看>>
P3804 【模板】后缀自动机
查看>>
小球下落(Dropping Balls, Uva 679)
查看>>
精简菜单和完整菜单之间进行切换
查看>>
一个关于log4j的悲伤的故事
查看>>
PCA
查看>>
ajax上传文件
查看>>
java中通过绝对路径将图片存入数据库
查看>>