创建节点

通过客户端API来创建一个数据节点,有一下两个接口:

  1. public String create(final String path, byte data[], List<ACL> acl,
  2. CreateMode createMode)
  3.  
  4. public void create(final String path, byte data[], List<ACL> acl,
  5. CreateMode createMode, StringCallback cb, Object ctx)

这两个接口分别是同步和异步的方式创建节点

需要注意的是无论是同步还是异步创建节点,zookeeper都不支持递归创建,即在不存在父节点的情况下创建一个子节点

。另外如果一个节点已经存在了,那么再创建同名节点时会抛出异常:NodeExistException

目前,节点的内容只支持byte[]数组类型,也就是说zookeeper不负责对象序列化,需要开发者自己讲内容进行序列化与反序列化。

对已字符串直接调用getByte就行。对于其他复杂对象,可以使用序列化工具来进行。

关于权限控制,如果你的应用场景中没有复杂的权限要求,那么直接调用I Ids.OPEN_ACL_UNSAFE,这表明之后对这个节点的任何操作不受权限控制。

使用API创建一个节点:

  1. package znode;
  2.  
  3. import java.io.IOException;
  4. import java.util.concurrent.CountDownLatch;
  5.  
  6. import org.apache.zookeeper.CreateMode;
  7. import org.apache.zookeeper.KeeperException;
  8. import org.apache.zookeeper.WatchedEvent;
  9. import org.apache.zookeeper.Watcher;
  10. import org.apache.zookeeper.ZooDefs.Ids;
  11.  
  12. import session.CreateZookeeper;
  13.  
  14. import org.apache.zookeeper.ZooKeeper;
  15. import org.apache.zookeeper.Watcher.Event.KeeperState;
  16.  
  17. public class CreateZnode implements Watcher{
  18. public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  19.  
  20. @Override
  21. public void process(WatchedEvent event) {
  22. System.out.println("receive watched event:"+event);
  23. if (KeeperState.SyncConnected==event.getState()) {
  24. connectedSemaphore.countDown();
  25. }
  26.  
  27. }
  28. public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
  29. ZooKeeper zooKeeper = new ZooKeeper("192.168.64.60", 5000, new CreateZookeeper());
  30. connectedSemaphore.await();
  31.  
  32. String path1 = zooKeeper.create("/zk-test-ephemera-","".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  33. System.out.println("success create znode:"+path1);
  34.  
  35. String path2 = zooKeeper.create("/zk-test-ephemera-","".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
  36. System.out.println("success create znode:"+path2);
  37.  
  38. }
  39. }

上面两个片段使用同步方式创建节点:可以看出创建临时节点返回值就是传入的路劲

使用临时顺序节点返回值会自动加上一个数字

使用异步API创建节点

  1. package znode;
  2.  
  3. import java.io.IOException;
  4. import java.util.concurrent.CountDownLatch;
  5.  
  6. import org.apache.zookeeper.AsyncCallback;
  7. import org.apache.zookeeper.AsyncCallback.StringCallback;
  8. import org.apache.zookeeper.CreateMode;
  9. import org.apache.zookeeper.KeeperException;
  10. import org.apache.zookeeper.WatchedEvent;
  11. import org.apache.zookeeper.Watcher;
  12. import org.apache.zookeeper.ZooDefs.Ids;
  13.  
  14. import session.CreateZookeeper;
  15.  
  16. import org.apache.zookeeper.ZooKeeper;
  17. import org.apache.zookeeper.Watcher.Event.KeeperState;
  18.  
  19. public class CreateZnode2 implements Watcher{
  20. public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  21.  
  22. @Override
  23. public void process(WatchedEvent event) {
  24. System.out.println("receive watched event:"+event);
  25. if (KeeperState.SyncConnected==event.getState()) {
  26. connectedSemaphore.countDown();
  27. }
  28.  
  29. }
  30. public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
  31. ZooKeeper zooKeeper = new ZooKeeper("192.168.64.60", 5000, new CreateZookeeper());
  32. connectedSemaphore.await();
  33.  
  34. zooKeeper.create("/zk-test-ephemera-","".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL
  35. ,new IStringCallback(),"I am context");
  36. zooKeeper.create("/zk-test-ephemera-","".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL
  37. ,new IStringCallback(),"I am context");
  38. zooKeeper.create("/zk-test-ephemera-","".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL
  39. ,new IStringCallback(),"I am context");
  40.  
  41. }
  42. }
  43.  
  44. class IStringCallback implements AsyncCallback.StringCallback{
  45.  
  46. @Override
  47. public void processResult(int rc, String path, Object ctx, String name) {
  48. // TODO Auto-generated method stub
  49. System.out.println("create path result: ["+rc+","+path+","+ctx+","+"real path name:"+name+"]");
  50. }
  51.  
  52. }

和同步接口最大的区别在于,节点在创建的过程(包含网络通信和服务端的创建过程),是异步的。而且我们需要注意的是

同步创建过程时我们需要关注接口抛出的异常,而在异步接口中,是不会抛出异常的,所有的异常都会在回调函数中通过Result Code来体现。

删除节点

  1. public void delete(final String path, int version)
  2.  
  3. public void delete(final String path, int version, VoidCallback cb,
  4. Object ctx)

这里列出的两个API是同步和异步的删除接口,API方法的参数说明如表5-5所示。

删除节点和更新节点的操作非常相似,在zookeeper中只允许删除叶子节点。也就是说,如果一个节点存在子节点的话

那么这个节点将无法直接删除,必须先删除其所有子节点。

读取数据

读取数据,包含子节点列表的获取和节点数据的获取。

1.getChildren

首先我们先看看注册watcher。如果zookeeper客户端获取到指定节点的子节点列表后,还需要订阅这个子节点列表的变化通知,

那么就可以通过注册一个Watcher来实现。当有子节点添加或删除时,服务端就会向客户端发送一个NodeChildrenChange的事件。

需要注意的是服务端向客户端发送事件通知时是不包含最新的节点列表的。是需要客户端主动重新获取的。

Stat,stat记录一个节点的基本属性信息。创建时的事务ID(cZxid),最后一次修改的事务ID(mZxid)和节点数据内容的长度

dataLength,我们可以将一个旧的stat变量传入,该stat会在执行过程中,被来自服务端响应的心的stat的替换掉。

  1. package getchildren;
  2.  
  3. import java.io.IOException;
  4. import java.util.List;
  5. import java.util.concurrent.CountDownLatch;
  6.  
  7. import org.apache.zookeeper.CreateMode;
  8. import org.apache.zookeeper.KeeperException;
  9. import org.apache.zookeeper.WatchedEvent;
  10. import org.apache.zookeeper.Watcher;
  11. import org.apache.zookeeper.ZooKeeper;
  12. import org.apache.zookeeper.Watcher.Event.EventType;
  13. import org.apache.zookeeper.Watcher.Event.KeeperState;
  14. import org.apache.zookeeper.ZooDefs.Ids;
  15.  
  16. public class GetChildren1 implements Watcher {
  17.  
  18. public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  19.  
  20. private static ZooKeeper zk = null;
  21. @Override
  22. public void process(WatchedEvent event) {
  23. if (KeeperState.SyncConnected==event.getState()) {
  24. if (EventType.None.getIntValue()==event.getState().getIntValue()&&null==event.getPath()) {
  25. connectedSemaphore.countDown();
  26. }else if (event.getType()==EventType.NodeChildrenChanged) {
  27. try {
  28. System.out.println("ReGetChild:"+zk.getChildren(event.getPath(), true));
  29. } catch (KeeperException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. } catch (InterruptedException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }
  36. }
  37.  
  38. }
  39.  
  40. }
  41. public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
  42. String path = "/zk-book";
  43. zk = new ZooKeeper("192.168.64.60:2181", 5000, new GetChildren1());
  44. connectedSemaphore.await();
  45.  
  46. zk.create(path, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  47. zk.create(path+"/c1", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  48.  
  49. List<String> children = zk.getChildren(path, true);
  50. System.out.println(children);
  51.  
  52. zk.create(path+"/c2", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  53. Thread.sleep(Integer.MAX_VALUE);;
  54.  
  55. }
  56. }

使用异步API获取子节点列表

  1. package getchildren;
  2. import java.io.IOException;
  3. import java.util.List;
  4. import java.util.concurrent.CountDownLatch;
  5.  
  6. import org.apache.zookeeper.AsyncCallback;
  7. import org.apache.zookeeper.CreateMode;
  8. import org.apache.zookeeper.KeeperException;
  9. import org.apache.zookeeper.WatchedEvent;
  10. import org.apache.zookeeper.Watcher;
  11. import org.apache.zookeeper.ZooKeeper;
  12. import org.apache.zookeeper.data.Stat;
  13. import org.apache.zookeeper.Watcher.Event.EventType;
  14. import org.apache.zookeeper.Watcher.Event.KeeperState;
  15. import org.apache.zookeeper.ZooDefs.Ids;
  16.  
  17. public class GetChildren2 implements Watcher {
  18.  
  19. public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  20.  
  21. private static ZooKeeper zk = null;
  22. @Override
  23. public void process(WatchedEvent event) {
  24. if (KeeperState.SyncConnected==event.getState()) {
  25. if (EventType.None.getIntValue()==event.getState().getIntValue()&&null==event.getPath()) {
  26. connectedSemaphore.countDown();
  27. }else if (event.getType()==EventType.NodeChildrenChanged) {
  28. try {
  29. System.out.println("ReGetChild:"+zk.getChildren(event.getPath(), true));
  30. } catch (KeeperException e) {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. } catch (InterruptedException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. }
  38.  
  39. }
  40.  
  41. }
  42. public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
  43. String path = "/zk-book";
  44. zk = new ZooKeeper("192.168.64.60:2181", 5000, new GetChildren2());
  45. connectedSemaphore.await();
  46.  
  47. zk.create(path, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  48. zk.create(path+"/c1", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  49.  
  50. zk.getChildren(path, true, new IChildren2Callback(),"i am context");
  51.  
  52. zk.create(path+"/c2", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  53. Thread.sleep(Integer.MAX_VALUE);;
  54.  
  55. }
  56. }
  57.  
  58. class IChildren2Callback implements AsyncCallback.Children2Callback{
  59.  
  60. @Override
  61. public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) {
  62. // TODO Auto-generated method stub
  63. System.out.println("Get Children znode result: "+rc+","+path+","+ctx+","+children+","+stat);
  64. }
  65.  
  66. }

getData

getData接口和上下文中的getChildren接口的用法相同,Watcher注册后,一旦节点的内容状态发生改变,zookeeper服务端会

向客户端发送一个NodeDataChanged的事件。API返回的结果类型时byte[].

使用同步AIP获取数据节点内容

  1. package getdata;
  2.  
  3. import java.io.IOException;
  4. import java.util.List;
  5. import java.util.concurrent.CountDownLatch;
  6.  
  7. import org.apache.zookeeper.CreateMode;
  8. import org.apache.zookeeper.KeeperException;
  9. import org.apache.zookeeper.WatchedEvent;
  10. import org.apache.zookeeper.Watcher;
  11. import org.apache.zookeeper.ZooKeeper;
  12. import org.apache.zookeeper.data.Stat;
  13. import org.apache.zookeeper.Watcher.Event.EventType;
  14. import org.apache.zookeeper.Watcher.Event.KeeperState;
  15. import org.apache.zookeeper.ZooDefs.Ids;
  16.  
  17. import getchildren.GetChildren1;
  18.  
  19. public class GetData1 implements Watcher {
  20. public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  21. private static ZooKeeper zk = null;
  22. private static Stat stat = new Stat();
  23.  
  24. @Override
  25. public void process(WatchedEvent event) {
  26. if (KeeperState.SyncConnected==event.getState()) {
  27. if (EventType.None.getIntValue()==event.getState().getIntValue()&&null==event.getPath()) {
  28. connectedSemaphore.countDown();
  29. }else if (event.getType()==EventType.NodeDataChanged) {
  30. try {
  31. byte[] data = zk.getData(event.getPath(), true, stat);
  32. System.out.println(new String(data));
  33. } catch (KeeperException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. } catch (InterruptedException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. }
  41.  
  42. }
  43.  
  44. }
  45. public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
  46. String path = "/zk-book";
  47. zk = new ZooKeeper("192.168.64.60:2181", 5000, new GetData1());
  48. connectedSemaphore.await();
  49.  
  50. zk.create(path, "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  51. System.out.println(zk.getData(path, true, stat));
  52.  
  53. zk.setData(path, "456".getBytes(), -1);
  54. Thread.sleep(Integer.MAX_VALUE);;
  55.  
  56. }
  57. }

数据内容或是数据版本发生变化,都胡出发服务端的NodeDataChanged通知。

异步API获取

  1. package getdata;
  2.  
  3. import java.io.IOException;
  4. import java.util.concurrent.CountDownLatch;
  5.  
  6. import org.apache.zookeeper.AsyncCallback;
  7. import org.apache.zookeeper.CreateMode;
  8. import org.apache.zookeeper.KeeperException;
  9. import org.apache.zookeeper.WatchedEvent;
  10. import org.apache.zookeeper.Watcher;
  11. import org.apache.zookeeper.ZooKeeper;
  12. import org.apache.zookeeper.data.Stat;
  13. import org.apache.zookeeper.Watcher.Event.EventType;
  14. import org.apache.zookeeper.Watcher.Event.KeeperState;
  15. import org.apache.zookeeper.ZooDefs.Ids;
  16.  
  17. public class GetData2 implements Watcher {
  18. public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  19. private static ZooKeeper zk = null;
  20. private static Stat stat = new Stat();
  21.  
  22. @Override
  23. public void process(WatchedEvent event) {
  24. if (KeeperState.SyncConnected==event.getState()) {
  25. if (EventType.None.getIntValue()==event.getState().getIntValue()&&null==event.getPath()) {
  26. connectedSemaphore.countDown();
  27. }else if (event.getType()==EventType.NodeDataChanged) {
  28. zk.getData(event.getPath(), true, new IDataback(),null);
  29. }
  30.  
  31. }
  32.  
  33. }
  34. public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
  35. String path = "/zk-book";
  36. zk = new ZooKeeper("192.168.64.60:2181", 5000, new GetData2());
  37. connectedSemaphore.await();
  38.  
  39. zk.create(path, "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL );
  40. zk.getData(path, true,new IDataback(),null);
  41.  
  42. zk.setData(path, "456".getBytes(), -1);
  43. Thread.sleep(Integer.MAX_VALUE);;
  44.  
  45. }
  46. }
  47.  
  48. class IDataback implements AsyncCallback.DataCallback{
  49.  
  50. @Override
  51. public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
  52. System.out.println(new String(data));
  53. System.out.println(stat.getCzxid());
  54. System.out.println(stat.getMzxid());
  55. System.out.println(stat.getVersion());
  56.  
  57. }
  58.  
  59. }

读《分布式一致性原理》JAVA客户端API操作2的更多相关文章

  1. 读<分布式一致性原理>初识zookeeper

    zookeeper是什么 zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如:数据发布/订阅,负载均衡,命名服务,分布式协调/通知 ,集群管理,Master选举 ...

  2. 读《分布式一致性原理》JAVA客户端API操作3

    更新数据 客户端可以通过zookeeper的API来更新一个节点的数据内容,有如下两个接口: public Stat setData(final String path, byte data[], i ...

  3. 读《分布式一致性原理》JAVA客户端API操作

    创建会话 客户端可以通过创建一个Zookeeper实例来连接服务器.4种构造方法如下 ZooKeeper(connectString, sessionTimeout, watcher): ZooKee ...

  4. 从Paxos到Zookeeper 分布式一致性原理与实践读书心得

    一 本书作者介绍 此书名为从Paxos到ZooKeeper分布式一致性原理与实践,作者倪超,阿里巴巴集团高级研发工程师,国家认证系统分析师,毕业于杭州电子科技大学计算机系.2010年加入阿里巴巴中间件 ...

  5. 《从Paxos到Zookeeper:分布式一致性原理与实践》【PDF】下载

    内容简介 Paxos到Zookeeper分布式一致性原理与实践从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议. ...

  6. zookeeper的Java客户端API

    zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API.这里主要记录下JAVA客户端API的使用. 1.创建会话 客户端可以通过创建一个ZooKeeper实 ...

  7. Zookeeper的java客户端API使用方法(五)

    前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...

  8. JAVA客户端API调用memcached两种方式

    1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...

  9. 我读《从Paxos到zookeeper分布式一致性原理与实践》

    从年后拿到这本书开始阅读,到准备系统分析师考试之前,终于读完了一遍,对Zookeeper有了一个全面的认识,整本书从理论到应用再到细节的阐述,内容安排从逻辑性和实用性上都是很优秀的,对全面认识Zook ...

随机推荐

  1. [剑指offer]09用两个栈实现队列插入和删除操作,C++实现

    原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 用两个栈实现队列的插入和删除操作 2.思路 栈服从先入后出的原则处理数据,队列服从先入先出的原则处理数 ...

  2. ubuntu下mysql安装提供外网访问

    修改配置文件 1. sudo apt-get install mysql-server #安装mysql服务器 2. sudo apt-get install  mysql-client #安装mys ...

  3. autoconf / automake工具使用介绍

    本文转自:http://blog.csdn.net/gulansheng/article/details/42683809 一.简介 作为Linux下的程序开发人员,一定都遇到过Makefile,用m ...

  4. ios逆向工程-静态分析

    最近在学习IOS逆向工程,查看网络上的资料也不是太多,边学边总结一下. 首先学习资料: 念茜(大神)的博客: http://nianxi.net <ios应用逆向工程 分析与实战> --- ...

  5. BZOJ1098 POI2007 办公楼biu 【链表+bfs】

    Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决 ...

  6. vector 介绍

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  7. elixir mix开发入门

    备注: 简单使用mix 进行项目的生成,同时添加docker 构建支持 1. 生成项目 mix new mydemoproject 输出信息如下: * creating README.md * cre ...

  8. php端安装rabbitmq-c

    php端安装rabbitmq-c url:https://github.com/alanxz/rabbitmq-c cd rabbitmq-c**** ./configure --prefix=/us ...

  9. Bitcoin 涉及到的数据结构和算法分析

    Bitcoin 2008 年中本聪提出 Bitcoin 的概念. 2009 年项目上线. 所有 coin 由 mining 产生,一共 2100 万枚.通过调整 difficulty, 确保每隔10m ...

  10. Hibernate学习5—Hibernate操作对象2

    第二节:Session 常用方法讲解 2)load和get()方法: 数据库中不存在与OID 对应的记录,Load()方法会抛出异常: load方法默认采用延迟加载,load出来的对象是一个代理类.开 ...