Java操作ZooKeeper(B)

来源:互联网 发布:图片制作pdf软件 编辑:程序博客网 时间:2024/06/05 06:34

创建ZNode
在整个的ZooKeeper 操作过程之中,如果要想进行数据的保存,那么所有的数据一定要有各自的节点,并且在ZooKeeper 里
面节点不允许多级创建,必须一级一级的向下创建。如果要想通过程序进行节点创建那么可以继续使用ZooKeeper 程序类完成,在
这个类中提供有一个创建节点方法:public String create(String path, byte[] data, List< ACL > acl, CreateMode createMode) throws KeeperException,InterruptedException;
|- “String path”:表示要创建节点路径(父节点必须存在);
|- “byte[] data”:表示要在节点上保存的数据,数据必须使用byte 数组来设置;
|- “List< ACL > acl”:设置访问控制列表,这个操作通过“org.apache.zookeeper.ZooDefs.Ids”来进行配置,有如下取值:
|- 随意访问:public static final ArrayList< ACL > OPEN_ACL_UNSAFE;
|- 随意读取:public static final ArrayList< ACL > READ_ACL_UNSAFE;
|- “CreateMode createMode”:表示该节点的类型,对于节点的类型通过“CreateMode”枚举来设置:
|- 永久节点:客户端关闭后该节点依然会保留;
|- 用户定义名称:public static final CreateMode PERSISTENT;
|- 用户定义名称-序列:public static final CreateMode PERSISTENT_SEQUENTIAL;
|- 临时节点:客户端连接时会保留几点,但是关闭之后节点自动删除;
|- 用户定义名称:public static final CreateMode EPHEMERAL;
|- 用户定义名称-序列:public static final CreateMode EPHEMERAL_SEQUENTIAL;
创建永久化的ZNode

public class ZooKeeperCreateZNodeP {    private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181:2181" ;    public static void main(String[] args) throws Exception {        ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){        @Override        public void process(WatchedEvent event) {            // 此处的方法体暂时为空        }}) ;        String noseqZNode = zkClient.create("/java", "新世界,你好!".getBytes("UTF-8"),        Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT) ;        System.out.println("1、创建新节点:" + noseqZNode);        String seqZNode = zkClient.create("/bigdata", "世界,晚安!".getBytes("UTF-8"),        Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL) ;        System.out.println("2、创建新节点:" + seqZNode);    }}

当前的节点不存在才可以进行创建处理,否则无法创建。


创建临时节点

public class ZooKeeperCreateZNodeE {    private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ;    public static void main(String[] args) throws Exception {        ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){        @Override        public void process(WatchedEvent event) {            // 此处的方法体暂时为空        }}) ;        String noseqZNode = zkClient.create("/a", "新世界,你好!".getBytes("UTF-8"),        Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL) ;        System.out.println("1、创建新节点:" + noseqZNode);        String seqZNode = zkClient.create("/b", "世界,晚安!".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE,        CreateMode.EPHEMERAL_SEQUENTIAL) ;        System.out.println("2、创建新节点:" + seqZNode);        Thread.sleep(Long.MAX_VALUE);    }}

节点数据操作
节点的数据操作有设置、取得等基本功能。
1、 取得节点数据:
在ZooKeeper 客户端里面可以使用“get”命令取得节点的内容,那么对于程序而言,则可以使用如下的方法取得节点的数据:
· 取得数据:public byte[] getData(String path, boolean watch, Stat stat) throws KeeperException,InterruptedException;
|- “String path”:设置要取得数据的节点名称;
|- “boolean watch”:表示的是是否需要进行监听;
|- “Stat stat”:取得节点状态信息;

public class ZooKeeperGetData {    private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ;    public static void main(String[] args) throws Exception {        ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){        @Override        public void process(WatchedEvent event) {        // 此处的方法体暂时为空        }}) ;        Stat stat = new Stat() ;        String data = new String(zkClient.getData("/java", true, stat)) ;        System.out.println(data);        System.out.println(stat);    }}

2、 判断数据节点是否存在
正常来讲当节点存在的时候才可以通过节点取得相应的数据,所以如果要想判断节点是否存在可以使用以下方法:
· 判断:public Stat exists(String path, boolean watch) throws KeeperException, InterruptedException;
|- 该判断方法返回的是一个Stat 对象,如果有节点则不为null;

public class ZooKeeperExists {    private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ;    public static void main(String[] args) throws Exception {        ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){        @Override        public void process(WatchedEvent event) {        // 此处的方法体暂时为空        }}) ;        Stat stat = zkClient.exists("/java", true) ;        if (stat != null) { // 当前节点存在        String data = new String(zkClient.getData("/java", true, stat)) ;        System.out.println(data);        }    }}

3、 修改节点数据:
在ZooKeeper 客户端里面如果要修改节点的数据使用的set 命令完成,现在可以使用如下方法完成:
· 方法:public Stat setData(String path, byte[] data, int version) throws KeeperException,InterruptedException;

public class ZooKeeperSetData {    private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ;    public static void main(String[] args) throws Exception {        ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){        @Override        public void process(WatchedEvent event) {            // 此处的方法体暂时为空        }}) ;        Stat stat = zkClient.setData("/java", "hadoop".getBytes(), 0) ; // 设置数据        System.out.println(stat);    }}

4、 删除节点
如果要删除节点,使用方法:public void delete(String path, int version) throws InterruptedException, KeeperException;

public class ZooKeeperDelete {    private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ;    public static void main(String[] args) throws Exception {        ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){        @Override        public void process(WatchedEvent event) {            // 此处的方法体暂时为空        }}) ;        if (zkClient.exists("/java", true) != null) { // 节点存在            zkClient.delete("/java", -1);        }    }}
0 0
原创粉丝点击