【Zookeeper】Java客户端
API介绍
地址:http://zookeeper.apache.org/doc/r3.4.6/api/index.html
org.apache.zookeeper.Zookeeper
是客户端入口主类,负责建立与server
的会话,它提供了下面几类主要方法
功能 | 描述 |
---|---|
create | 在本地目录树中创建一个节点 |
delete | 删除一个节点 |
exists | 测试本地是否存在目标节点 |
get/setData | 从目标节点上读取/写数据 |
get/setACL | 获取/设置目标节点访问控制列表信息 |
getChildren | 获取某一个节点下所有子节点的列表 |
sync | 等待要被传送的数据 |
示例代码
创建会话
/**
* 使用SessionId和SessionPasswd创建zookeeper会话
* @author dj4817
* @version $Id: ZookeeperWatcher.java, v 0.1 2018/3/12 13:44 dj4817 Exp $$
*/
public class ZooKeeperConstructorUsageWithSIDPASSWD implements Watcher {
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
/**
* 测试使用SessionId和SessionPasswd创建zookeeper会话
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ZooKeeper zookeeper = new ZooKeeper(Constants.connectString, Constants.sessionTimeout, new ZooKeeperConstructorUsageWithSIDPASSWD());
connectedSemaphore.await();
long sessionId = zookeeper.getSessionId();
byte[] passwd = zookeeper.getSessionPasswd();
System.out.println("sessionId=" + sessionId + "; passwd=" + passwd.toString());
//Use illegal sessionId and sessionPassWd
new ZooKeeper(Constants.connectString, Constants.sessionTimeout, new ZooKeeperConstructorUsageWithSIDPASSWD(), 1L, "test".getBytes());
//Use correct sessionId and sessionPassWd
new ZooKeeper(Constants.connectString, Constants.sessionTimeout, new ZooKeeperConstructorUsageWithSIDPASSWD(), sessionId, passwd);
Thread.sleep(Integer.MAX_VALUE);
}
/**
* 异步通知处理
* @param event
*/
@Override
public void process(WatchedEvent event) {
System.out.println("Receive watched event:" + event);
if (KeeperState.SyncConnected == event.getState()) {
connectedSemaphore.countDown();
}
}
}
运行结果:
Receive watched event:WatchedEvent state:SyncConnected type:None path:null
sessionId=27939408385212418; passwd=[B@759ebb3d
Receive watched event:WatchedEvent state:Expired type:None path:null
Receive watched event:WatchedEvent state:SyncConnected type:None path:null
- 第一次使用错误的
sessionId
和sessionPasswd
来创建Zookeeper
客户端的实例,结果客户端接收到了服务端的Expired
事件通知; - 第二次使用正确的
sessionId
和sessionPasswd
,连接成功。
创建节点
- Zookeeper不支持递归创建节点,即无法在父节点不存在的情况下创建一个子节点。
- 如果一个节点已经存在了,那么创建同名节点的时候,会抛出
NodeExistsException
异常。
/**
* 使用同步方式创建zookeeper节点
* @author dj4817
* @version $Id: ZookeeperWatcher.java, v 0.1 2018/3/12 13:44 dj4817 Exp $$
*/
public class ZooKeeperCreateApiSyncUsage implements Watcher {
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
/**
* 测试使用同步方式创建zookeeper节点
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ZooKeeper zookeeper = new ZooKeeper(Constants.connectString, Constants.sessionTimeout, new ZooKeeperCreateApiSyncUsage());
connectedSemaphore.await();
// Ids.OPEN_ACL_UNSAFE:表明之后这个节点的任何操作都不受权限控制。
String path1 = zookeeper.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("Success create znode: " + path1);
String path2 = zookeeper.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("Success create znode: " + path2);
}
/**
* 异步通知处理
* @param event
*/
@Override
public void process(WatchedEvent event) {
if (KeeperState.SyncConnected == event.getState()) {
connectedSemaphore.countDown();
}
}
}
运行结果
Success create znode: /zk-test-ephemeral-
Success create znode: /zk-test-ephemeral-0000000001
- 如果创建一个临时节点,那么
create
方法返回当时传入的path
参数。 - 如果创建一个临时顺序节点,那么
Zookeeper
会自动在节点后缀加上一个数字,返回create
方法返回这个节点的完整路径。
评论区