Zookeeper基础API的操作-创建节点

同步创建

package com.paic.Spark;

import org.apache.zookeeper.*;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * Created by xlucas on 2018/4/11.
 */
public class ZookeeperDemo2 implements Watcher {
    private static CountDownLatch connectedSe=new CountDownLatch(1);
    public  static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        //构建会话
        ZooKeeper zk=new ZooKeeper("10.25.76.173", 2000, new ZookeeperDemo2());
        connectedSe.await();
        String path1=zk.create("/zk-hosts","create1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println("sucess create path "+ path1);

        String path2=zk.create("/zk-hosts1","create2".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
        System.out.println("sucess create path"+path2);

    }
    //实现了process方法该方法负责处理来自Zookeeper服务端的watcher通知,在收到服务端发来的syncConnected事件之后
    //解除主程序在CountDownLatch上的等待阻塞,至此客户端会话创建完毕
    @Override
    public void process(WatchedEvent event) {
        System.out.println("Receive watched event"+ event);
        if(Watcher.Event.KeeperState.SyncConnected==event.getState()){
            connectedSe.countDown();
        }

    }
}

运行结果:

Receive watched eventWatchedEvent state:SyncConnected type:None path:null
sucess create path /zk-hosts
sucess create path/zk-hosts10000000023

    从上面的程序可以看出,使用同步创建节点,临时节点和临时顺序节点,从返回的结果可以看出,如果创建了临时节点,那么PAI 返回值就是当时传入的path参数,如果创建了临时顺序节点,那么Zookeeper会自动在节点后缀加上一个数字,并且在PAI接口返回值中返回该数据节点的一个完整的节点路径

异步创建

package com.paic.Spark;

import org.apache.zookeeper.*;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * Created by xlucas on 2018/4/12.
 */
public class ZookeeperDemo4 implements Watcher {
    private static CountDownLatch connectedSe=new CountDownLatch(1);
    public  static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        //构建会话
        ZooKeeper zk=new ZooKeeper("10.25.76.173", 2000, new ZookeeperDemo4());
        connectedSe.await();
        zk.create("/zk-hosts-ephemeral-","create1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL,new StringCallback(),"context");
        zk.create("/zk-hosts-ephemeral-","create1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL,new StringCallback(),"context");
        zk.create("/zk-hosts1-ephemeral-","create2".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL,new StringCallback(),"context");
        Thread.sleep(Integer.MAX_VALUE);
    }
    //实现了process方法该方法负责处理来自Zookeeper服务端的watcher通知,在收到服务端发来的syncConnected事件之后
    //解除主程序在CountDownLatch上的等待阻塞,至此客户端会话创建完毕
    @Override
    public void process(WatchedEvent event) {
        System.out.println("Receive watched event"+ event);
        if(Watcher.Event.KeeperState.SyncConnected==event.getState()){
            connectedSe.countDown();
        }

    }
}

package com.paic.Spark;

import org.apache.zookeeper.AsyncCallback;

/**
 * Created by xlucas on 2018/4/12.
 */
public class StringCallback implements AsyncCallback.StringCallback {
    @Override
    public void processResult(int rc, String path, Object ctx, String name) {
        System.out.println("create path result:["+ rc +", "+path +","+ctx+", real path name "+name+" ]");
    }
}

运行结果

Receive watched eventWatchedEvent state:SyncConnected type:None path:null
create path result:[0, /zk-hosts-ephemeral-,context, real path name /zk-hosts-ephemeral- ]
create path result:[-110, /zk-hosts-ephemeral-,context, real path name null ]
create path result:[0, /zk-hosts1-ephemeral-,context, real path name /zk-hosts1-ephemeral-0000000029 ]

    从这个程序片段中可以看出,使用异步方式创建接口也很简单,用户仅仅需要实现AsyncCallback.StringCallback()接口即可,AsyncCallback包含了ACLCallback、Children2Callback、ChildrenCallback、DataCallback、MultiCallback、StatCallback、StringCallback、VoidCallback八种不同的回调接口,用户可以在不同的异步接口中实现不同的接口
和同步接口方法最大的区别在于,节点的创建过程(包括网络通信和服务端的节点创建过程)是异步的,并且在同步接口调用过程中,我们需要关注接口抛出异常的可能,但是在异步接口中,接口本身是不会抛出异常的,所有的异常都会在回调函数中通过Result Code(响应吗)来体现

回调函数 processResult(int rc, String path, Object ctx, String name)参数说明
**Rc:**Result Code服务端响应码,客户端可以从这个响应码中识别出PAI调用的结果,响应码说明
        0:接口调用成功
        -4:客户端和服务端连接已断开
        -110:指定节点已经存在
        -112:会话已过期
Path:接口调用时传入API的数据节点和节点路径参数
Ctx:接口调用时传入API的ctx参数值
Name:实际在服务端创建的节点名,从上面程序我们可以看到,第三次创建节点时,由于创建的节点类型是顺序节点,因此在服务端没有真正创建好顺序节点之前,客户端无法知道节点的完整节点路径,于是在回调方法中,服务端会返回这个数据节点的完整节点路径

猜你喜欢

转载自blog.csdn.net/paicMis/article/details/79922687