在我们了解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(); //返回节点数据 }
相关推荐
•Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. •RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能 •Registry: 服务目录框架用于服务的注册和服务事件发布和订阅 在...
•Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. •RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能 •Registry: 服务目录框架用于服务的注册和服务事件发布和订阅 在...
学习 Servlet 和 JSP 需要了解 HTTP 协议、Request 和 Response 对象、Session 和 Cookie 等相关知识。 Spring 框架 Spring 是目前最流行的 Java 框架之一,它提供了广泛的功能,如依赖注入、AOP、事务管理等。...
2. JSP内置对象:page、request、response、session、application、out、exception等,各有其作用。 3. session与cookie:session用于服务器端存储用户状态,cookie用于客户端存储。 七、异常处理 1. throw和...
List<CartItem> itemList = getCartItemList(request, response); // 判断购物车商品列表中是否存在此商品 for (CartItem cItem : itemList) { // 如果存在此商品longValue() if (cItem.getId() == itemId) { ...
6. **Kafka网络层**:研究Kafka的网络通信协议,包括Request和Response的序列化和反序列化,以及Socket Server的实现。 7. **Offset管理**:深入理解消费者偏移量(Offsets)的存储和提交,以及如何保证消费者在...
8. 信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。 9. 网络传输层(Transport):抽象mina和netty...
response = client.send_request(some_params) ``` 总的来说,`cs18-api-client`是一个面向云原生环境的Python库,它允许开发者便捷地与`cs18`服务进行API交互,同时可能整合了Zookeeper以支持分布式应用的需求。...
在网页开发中,访问统计是一项...总的来说,通过JSP实现访问统计,不仅需要掌握JSP基本语法和对象,还需要理解数据库操作、会话管理以及可能的性能优化策略。这个过程涉及的技术广泛,对于提升Web开发技能非常有帮助。
3. **网络通信**:分析Kafka的Netty为基础的网络层实现,探讨Request/Response模式,以及如何实现高效的I/O处理和连接管理。 4. **Producer工作原理**:详述生产者如何发送消息,包括Partitioner策略、批处理和延迟...
conn.request('GET', '/path') # 获取响应 response = conn.getresponse() # 处理响应数据 data = response.read() ``` 总的来说,`ndg_httpsclient`是一个强大的工具,它为Python开发者提供了更安全、可控的...
库提供了丰富的API,如`create_authn_request`用于创建认证请求,`handle_response`用于处理IdP返回的响应。开发者可以根据具体的业务需求,灵活地构建和定制SAML2流程。 除了SAML2的核心功能,这个库还考虑到了云...
课程还讲解了ZeroMQ消息队列的实现,包括publisher-subscriber、request-response和Router-Dealer模式。另外,还涉及了Redis缓存系统,包括其全局唯一ID保存机制、消息队列、事务、安全性能以及备份恢复。Nginx作为...
它通过实现sync-over-async和request-response的消息机制来确保服务调用的可靠性和高效性。其中: - **Sync-over-Async**:这种机制允许客户端在发起请求后能够继续执行其他操作,而无需等待响应返回。一旦服务端的...
public ResponseEntity<String> reduceInventory(@RequestBody Order order) { // 减少库存的逻辑... return ResponseEntity.ok("Inventory reduced successfully"); } } ``` 在这个例子中,`OrderService`...
SolrResponse response = client.request(new SolrSQLRequest(), query); SolrDocumentList documents = (SolrDocumentList) response.getResponse().get("response"); for (SolrDocument doc : documents) { // ...
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 ...