Zookeeper--Java API
Zookeeper--Java API及示例
zk客户端要连接zk服务器,首先需要创建org.apache.zookeeper.ZooKeeper的一个实例对象,然后调用该类的接口来和服务器交互。
主要接口如下:
String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
创建一个给定的目录节点path,并给它设置数据(所创建节点的父节点必须先存在),CreateMode标识有4种形式的目录节点,分别是:
PERSISTENT:持久化节点,节点储存的数据不会丢失
PERSISTENT_SEQUENTIAL:按顺序自动编号的持久化节点,根据已经存在的节点名自动加一,并返回该名称
EPHEMERAL:临时节点,一旦创建该节点的客户端与服务端session超时,该节点自动删除。
EPHEMERAL_SEQUENTAL:临时自动编号节点
Stat exists(String path, boolean watch) Stat exists(String path, Watcher watcher)
判断某个path是否存在,并设置是否监控这个目录节点,这个watcher是在创建zk示例时指定的watcher。
重载方法可以指定特定的watcher
void delete(String path, int version)
删除path所对应的节点,version为-1时删除所有版本即删除节点的所有数据, 有子节点的节点需要先删除子节点,否则删除失败。
List<String> getChilden(String path, boolean watch)
获取path下所有的子节点,同样有一个指定watcher的重载方法
Stat setData(String path, byte[] data, int version)
给path设置数据,可以指定数据的版本号,如果version为-1则匹配所有版本
byte[] getData(String path, boolean watch, Stat stat)
获取这个path对应节点的数据,数据的版本可以通过stat来指定,watch为设置是否监控该节点的状态
void addAuthInfo(String scheme, byte[] auth)
客户端将自己的授权信息提交给服务器,服务器将根据授权信息检查客户端的访问权限
Stat setACL(String path, List<ACL> acl, int version)
给节点重新设置访问权限,zk中节点的权限不具有继承性。ACL由perms和Id组成,Perms由ALL, READ, WRITE, CREATE, DELETE, ADMIN几种。
ID标识了访问目录节点的身份列表,有ANYONE_ID_UNSAFE=new Id("world","anyone") AUTH_IDS=new Id("auth","")
List<ACL> getACL(String path, Stat stat)
获取某个目录节点的访问权限列表
示例:
public class ZnodeTest { // 会话超时时间 private static final int SESSION_TIMEOUT = 30000; // 创建 ZooKeeper 实例 ZooKeeper zk; // 创建 Watcher 实例 Watcher wh = new Watcher() { public void process(WatchedEvent event) { System.out.println("监控到:" + event.getType()); } }; // 初始化 ZooKeeper 实例 private void createZKInstance() throws IOException { zk = new ZooKeeper("localhost", ZnodeTest.SESSION_TIMEOUT, this.wh); } private void ZKOperations() throws IOException, InterruptedException, KeeperException { List<String> level2 = zk.getChildren("/", false); for (String s : level2) { System.out.println("level2:" + s); } rDelete("/zoo"); System.out.println("创建节点zoo"); zk.create("/zoo", "zoo data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println("创建子节点keep"); zk.create("/zoo/keep", "keep data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); zk.create("/zoo/keep", "keep data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); System.out.println("查看是否创建成功: " + new String(zk.getData("/zoo", false, null))); System.out.println("修改节点数据 "); zk.setData("/zoo", "zoo data update".getBytes(), -1); System.out.println("查看是否修改成功: " + new String(zk.getData("/zoo", false, null))); System.out.println("查看子节点"); List<String> keeps = zk.getChildren("/zoo", false); for (String s : keeps) { System.out.println("keeps:" + s); } System.out.println("删除节点 "); rDelete("/zoo"); System.out.println("查看节点是否被删除: " + zk.exists("/zoo", false)); } private void rDelete(String path) throws KeeperException, InterruptedException { if (zk.exists(path, false) == null) { return; } List<String> ls = zk.getChildren(path, false); for (String s : ls) { rDelete(path + "/" + s); } zk.delete(path, -1); } private void rCreate(String path){ } private void ZKClose() throws InterruptedException { zk.close(); } public static void main(String[] args) throws IOException, InterruptedException, KeeperException { ZnodeTest dm = new ZnodeTest(); dm.createZKInstance(); dm.ZKOperations(); dm.ZKClose(); } }
---
输出:
监控到:None
level2:zookeeper
创建节点zoo
创建子节点keep
查看是否创建成功: zoo data
修改节点数据
查看是否修改成功: zoo data update
查看子节点
keeps:keep0000000001
keeps:keep0000000000
删除节点
查看节点是否被删除: null
递归删除节点及其子节点:
private void rDelete(String path) throws KeeperException, InterruptedException { if (zk.exists(path, false) == null) { return; } List<String> ls = zk.getChildren(path, false); for (String s : ls) { rDelete(path + "/" + s); } zk.delete(path, -1); }
---
参考: