`
小爷有里有面
  • 浏览: 26288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ZooKeeper的request和response对象

阅读更多

在我们了解request和response对象之前我们要先了解一下org.apache.zookeeper.ClientCnxn、org.apache.zookeeper.proto.ReplyHeader。

 

ClientCnxn做了什么

从源码的说明上我们可以了解到ClientCnxn用于管理客户端的 socket i/o,并维护可用服务器的列表,提供连接服务。我们所有与Zookeeper Server交互的操作都是由ClientCnxn完成的。

 

    //org.apache.zookeeper.ZooKeeper
    public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
            long sessionId, byte[] sessionPasswd)
        throws IOException
    {
        LOG.info("Initiating client connection, connectString=" + connectString
                + " sessionTimeout=" + sessionTimeout
                + " watcher=" + watcher
                + " sessionId=" + sessionId
                + " sessionPasswd="
                + (sessionPasswd == null ? "<null>" : "<hidden>"));

        watchManager.defaultWatcher = watcher;
        cnxn = new ClientCnxn(connectString, sessionTimeout, this, watchManager, sessionId, sessionPasswd);
        cnxn.start();
    }

 

 

ReplyHeader是什么

从名称上我们可以读懂这个类包含了请求的返回信息。成员变量err可以通过get方法得到,用于记录错误码,0表示操作成功。

 

        if (r.getErr() != 0) {
            if (r.getErr() == KeeperException.Code.NONODE.intValue()) {
                return null;
            }
            throw KeeperException.create(KeeperException.Code.get(r.getErr()),
                    clientPath);
        }

 

 

ZooKeeper.getData中的request、response

org.apache.zookeeper.proto.GetDataRequest类中包含两个成员变量 String path 和 boolean watch。path是请求的节点路径,watch表示对节点是否进行观察。可以通过 GetDataRequest(String path, boolean watch) 构造方法和 get/set 方法进行操作。

 

  GetDataRequest request = new GetDataRequest();
  request.setPath(serverPath);
  request.setWatch(watcher != null);

org.apache.zookeeper.proto.GetDataResponse类中包含两个成员变量byte[] data和Stat stat。data用于存储请求完成后返回的节点数据,stat用于存储请求完成后返回的节点状态信息。当请求完成后我们可以调用get方法来取得数据。

 

 

  GetDataResponse response = new GetDataResponse();
  ...
  if (stat != null) {
    DataTree.copyStat(response.getStat(), stat);
  }
  return response.getData();

 当我们具有了request和response后就可以通过ClientCnxn的submitRequest方法得到节点数据了。

 

 

    public byte[] getData(final String path, Watcher watcher, Stat stat)
        throws KeeperException, InterruptedException
     {
        final String clientPath = path;
        PathUtils.validatePath(clientPath);

        // the watch contains the un-chroot path
        WatchRegistration wcb = null;
        if (watcher != null) {
            wcb = new DataWatchRegistration(watcher, clientPath); //封装观察对象
        }

        final String serverPath = prependChroot(clientPath); //得到节点的服务器全路径

        RequestHeader h = new RequestHeader(); //定义请求头对象
        h.setType(ZooDefs.OpCode.getData); //设置本次请求类型为得到值的操作
        GetDataRequest request = new GetDataRequest(); //实例化request对象和属性定义
        request.setPath(serverPath);
        request.setWatch(watcher != null);
        GetDataResponse response = new GetDataResponse(); //实例化respinse对象
        ReplyHeader r = cnxn.submitRequest(h, request, response, wcb); //进行请求并得到回复信息
        if (r.getErr() != 0) {
            throw KeeperException.create(KeeperException.Code.get(r.getErr()),
                    clientPath);
        }
        if (stat != null) {
            DataTree.copyStat(response.getStat(), stat); //将成功后返回的节点状态信息转写到用户指定的Stat对象中
        }
        return response.getData(); //返回节点数据
    }

 

 

分享到:
评论

相关推荐

    dubbo2.0.8 下载

    •Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. •RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能 •Registry: 服务目录框架用于服务的注册和服务事件发布和订阅 在...

    dubbo最新版本2.0.9 下载

    •Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. •RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能 •Registry: 服务目录框架用于服务的注册和服务事件发布和订阅 在...

    学习Java框架的正确顺序

    学习 Servlet 和 JSP 需要了解 HTTP 协议、Request 和 Response 对象、Session 和 Cookie 等相关知识。 Spring 框架 Spring 是目前最流行的 Java 框架之一,它提供了广泛的功能,如依赖注入、AOP、事务管理等。...

    Java最常见的面试题208道.docx

    2. JSP内置对象:page、request、response、session、application、out、exception等,各有其作用。 3. session与cookie:session用于服务器端存储用户状态,cookie用于客户端存储。 七、异常处理 1. throw和...

    一个适合新手学习的电商项目

    List&lt;CartItem&gt; itemList = getCartItemList(request, response); // 判断购物车商品列表中是否存在此商品 for (CartItem cItem : itemList) { // 如果存在此商品longValue() if (cItem.getId() == itemId) { ...

    Kafka源码解析及实战

    6. **Kafka网络层**:研究Kafka的网络通信协议,包括Request和Response的序列化和反序列化,以及Socket Server的实现。 7. **Offset管理**:深入理解消费者偏移量(Offsets)的存储和提交,以及如何保证消费者在...

    Dubbo 30道面试题及答案.docx

    8. 信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。 9. 网络传输层(Transport):抽象mina和netty...

    PyPI 官网下载 | cs18-api-client-0.0.2.1711.tar.gz

    response = client.send_request(some_params) ``` 总的来说,`cs18-api-client`是一个面向云原生环境的Python库,它允许开发者便捷地与`cs18`服务进行API交互,同时可能整合了Zookeeper以支持分布式应用的需求。...

    jsp.rar_访问统计_访问量

    在网页开发中,访问统计是一项...总的来说,通过JSP实现访问统计,不仅需要掌握JSP基本语法和对象,还需要理解数据库操作、会话管理以及可能的性能优化策略。这个过程涉及的技术广泛,对于提升Web开发技能非常有帮助。

    kafka源码解析与实战

    3. **网络通信**:分析Kafka的Netty为基础的网络层实现,探讨Request/Response模式,以及如何实现高效的I/O处理和连接管理。 4. **Producer工作原理**:详述生产者如何发送消息,包括Partitioner策略、批处理和延迟...

    PyPI 官网下载 | ndg_httpsclient-0.3.3.tar.gz

    conn.request('GET', '/path') # 获取响应 response = conn.getresponse() # 处理响应数据 data = response.read() ``` 总的来说,`ndg_httpsclient`是一个强大的工具,它为Python开发者提供了更安全、可控的...

    PyPI 官网下载 | dm.zope.saml2-5.0.tar.gz

    库提供了丰富的API,如`create_authn_request`用于创建认证请求,`handle_response`用于处理IdP返回的响应。开发者可以根据具体的业务需求,灵活地构建和定制SAML2流程。 除了SAML2的核心功能,这个库还考虑到了云...

    零声学院 第9代 Linux CC++后台架构开发 成长体系课程 - v1.21

    课程还讲解了ZeroMQ消息队列的实现,包括publisher-subscriber、request-response和Router-Dealer模式。另外,还涉及了Redis缓存系统,包括其全局唯一ID保存机制、消息队列、事务、安全性能以及备份恢复。Nginx作为...

    DUBBO 详细介绍

    它通过实现sync-over-async和request-response的消息机制来确保服务调用的可靠性和高效性。其中: - **Sync-over-Async**:这种机制允许客户端在发起请求后能够继续执行其他操作,而无需等待响应返回。一旦服务端的...

    Apache Dubbo:Dubbo与微服务架构:集成与实践

    public ResponseEntity&lt;String&gt; reduceInventory(@RequestBody Order order) { // 减少库存的逻辑... return ResponseEntity.ok("Inventory reduced successfully"); } } ``` 在这个例子中,`OrderService`...

    使用java实现solr-7.1.0的api和solr最新支持的sql查询

    SolrResponse response = client.request(new SolrSQLRequest(), query); SolrDocumentList documents = (SolrDocumentList) response.getResponse().get("response"); for (SolrDocument doc : documents) { // ...

    用于大规模的生产部署Squbs.zip

    Pipeline: An infrastructure allowing sequencing and plugging in of request/response filters. These are used, for instance, for security, rate limiting, logging, etc. Each of the components have ...

Global site tag (gtag.js) - Google Analytics