zookeeper学习笔记--创建节点

1:客户端可以通过ZK的API来创建数据节点,有如下两个接口:

同步方式

String Create(final String path,  byte data[],  List<ACL> acl,  CreateMode createmode)

异步方式

void Create(final String path,  byte data[],  List<ACL> acl,  CreateMode createmode,  StringCallback cb,  Object ctx)

注意:

  • ZK不支持递归创建,即无法在父节点不存在的情况下创建子节点。
  • ZK节点数据类型只支持字节数组类型(byte[]),也就是ZK不负责为节点内容进行序列化和反序列化。

2:参数说明:

path

需要创建的数据节点路径,如:/zk/foo

data[]

一个字节数组,节点创建后的初始内容

acl

节点的ACL策略

createmode

节点类型,是一个枚举类型,通常四种可选类型:

  • 持久(PERSISTENT)
  • 持久顺序(PERSISTENT_SEQUENTIAL)
  • 临时(EPHEMERAL)
  • 临时顺序(EPHEMERAL_SEQUENTIAL)

cb

注册一个异步回调函数,开发人员需要实现StringCallback接口,主要对下面这个方法重写: 

void processResult(int rc,  String path,  Object ctx,  String name)

当服务端节点创建完毕后,zk客户端会自动回调这个方法,这样就可以自动处理相关业务了。

ctx 

用于传递一个对象,可以在回调方法执行的时候使用,通常是放一个上下文信息

 

void processResult(int rc,  String path,  Object ctx,  String name)参数说明:

rc

result code,服务端响应码,用来判断调用结果,常见响应码如下:

  • 0   接口调用成功
  • -4 客户端和服务端断开连接
  • -110 指定节点已存在
  • -112 会话已过期

path

接口调用时传入API的数据节点的节点路径参数值

ctx

接口调用时传入API的ctx参数值

name

实际在服务端创建的节点名

代码示例

package LearningZK;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.*;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;

public class UsingZookeeperAPI implements Watcher{

    private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

    public static void main(String[] args) throws Exception{

        /*使用ZK构造方法实例化ZK对象来建立会话*/
        /*new UsingZookeeperAPI 实现watcher接口,重写process方法,处理服务端返回的异步通知*/
        ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181",
                5000,
                new UsingZookeeperAPI());

        System.out.println(zookeeper.getState());
//        long sessionID = zookeeper.getSessionId();     //获取会话ID
//        byte[] sessionPasswd = zookeeper.getSessionPasswd(); //获取会话密钥
        try {
            connectedSemaphore.await();
        } catch (InterruptedException e) {}
        System.out.println("ZooKeeper session established.");

        /*以同步的方式创建ZK临时节点*/
        String path1 = zookeeper.create("/ZK_test", "".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println("Create Znode Success:"+path1);

        /*以同步的方式创建ZK临时顺序节点*/
        String path2 = zookeeper.create("/ZK_test","".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
        System.out.println("Create Znode Succsess:"+path2);

        /*以异步的方式创建ZK临时节点*/
        zookeeper.create("/ZK_test_async", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, new AsyncCallBack(), "I am content");
        Thread.sleep(Integer.MAX_VALUE);
    }

    /*处理ZK服务端watcher通知,再接收到服务端发来的SyncConnected通知后,解除主程序的等待阻塞*/
    public void process(WatchedEvent event) {
        System.out.println("Receive watched event:" + event);
        if (KeeperState.SyncConnected == event.getState()) {
            connectedSemaphore.countDown();
        }
    }
}


class AsyncCallBack implements AsyncCallback.StringCallback{
    public void processResult(int rc,  String path,  Object ctx,  String name){
        System.out.println("Create path result:["+rc+","+path+","+ctx+",real path name"+name);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35723073/article/details/81273791