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 | 节点类型,是一个枚举类型,通常四种可选类型:
|
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,服务端响应码,用来判断调用结果,常见响应码如下:
|
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);
}
}