Zookeeper API可以实现zookeeper客户端对节点的各种交互,所以我们只需要记住这一个zookeeper()入口即可,对每种方法提供了同步和异步两种方式
- 同步:有返回值,且需要抛异常
- 异步:无返回值,不需要关注异常,会通过返回状态码进行判断
Result Code
- 0 (ok) :接口调用成功
- -4 (ConnectionLoss) :客户端和服务端连接断开
- -110 (NodeExists) :节点已存在
- -112 (SessionExpired) :会话已过期
同步创建节点
- 参数说明
* @param path
* the path for the node
* @param data
* the initial data for the node
* @param acl
* the acl for the
提供的默认权限:
OPEN_ACL_UNSAFE:完全开放
/**源码注释
* This is a completely open ACL
*/
CREATOR_ALL_ACL:创建者拥有该节点所有权限
/**源码注释
* This ACL gives the creators authentication id's all permissions.
*/
READ_ACL_UNSAFE:所有客户端可读
/**源码注释
* This ACL gives the world the ability to read.
*/
node
* @param createMode
* specifying whether the node to be created is ephemeral
* and/or sequential
PERSISTENT :永久节点
PERSISTENT_SEQUENTIAL:永久序列节点
EPHEMERAL :临时节点
EPHEMERAL_SEQUENTIAL:临时序列节点
public String create(final String path, byte data[], List<ACL> acl,
CreateMode createMode)
- 完整代码
package com.ruozedata.bigdata.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class zkAPI implements Watcher{
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) throws Exception {
createZnode();
}
//同步创建节点
private static void createZnode() throws IOException, KeeperException, InterruptedException {
ZooKeeper zk = new ZooKeeper("hadoop001:2181", 5000, null);
System.out.println("连接状态:"+zk.getState());
connectedSemaphore.await();
System.out.println("连接状态:"+zk.getState());
String create = zk.create("/test", "12345".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("创建节点:"+create);
}
@Override
public void process(WatchedEvent event) {
System.out.print(String.valueOf(event));
}
}
异步创建节点
public void create(final String path, byte data[], List<ACL> acl,
CreateMode createMode, StringCallback cb, Object ctx)
可以看到异步创建比同步多了两个参数
- StringCallback cb:
该参数需要实现AsyncCallback.StringCallback()接口,并且需要实现此接口的processResult方法
new AsyncCallback.StringCallback() {
@Override
public void processResult(int rc, String path, Object ctx, String name) {
System.out.print( rc + ", " + path + ", " + ctx + ", real path name: " + name);
}
int rc:返回的状态码,见文章开始的异步返回状态吗描述,所以可以根据获取的此状态码用if或者switch翻译为相应的标识符
String path:接口调用时传入的API的数据节点的节点路径参数值
Object ctx:接口调用时传入的API的ctx参数值
String name:节点的真实名称
- Object ctx:
该参数可以自己定义内容
- 完整代码
package com.ruozedata.bigdata.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class zkAPI implements Watcher{
private static Logger logger = LoggerFactory.getLogger(zkAPI.class);
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) throws Exception {
asyncCreateZnode();
}
//异步创建节点
private static void asyncCreateZnode() throws Exception {
ZooKeeper zk = new ZooKeeper("hadoop001:2181", 3000, new zkAPI());
logger.info("连接状态:"+zk.getState());
Thread.sleep(1000);
logger.info("连接状态:"+zk.getState());
zk.create("/test1234", "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncCallback.StringCallback() {
@Override
public void processResult(int rc, String path, Object ctx, String name) {
logger.info("Create path result: [" + rc + ", " + path + ", " + ctx + ", real path name: " + name);
}
}, "SUCCESS");
Thread.sleep(1000);
}
@Override
public void process(WatchedEvent event) {
logger.info(String.valueOf(event));
}
}
欢迎关注公众号,一起愉快的交流