java调用zookeeper API demo

java调用zookeeper API的Demo如下,对zookeeper的增删改查以及监听实例

注意:

1.使用Thread.sleep()这个方法是防止查看完成后java程序就执行结束了,导致监听不到变化,其中这里的getChildren()监听相当于zookeeper在shell下的ls path watch一样的效果。

2.zookeeper的监听只会被执行一次,如果触发了设置的监听,那么下次就不会触发,可以在process方法里再次触发,这样监听就会一直存在。

3.zookeeper对节点的删除,只能删除叶子节点,它不允许我们删除的节点下面有子节点的node,如果需要删除非叶子节点以及它下面的节点,这里需要使用递归的方式删除。

package com.lijie.zk1;

import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

/**
 * 
 * @author LiJie
 *
 */
public class ZkSimple {

    private static final String connectString = "hadoop01:2181,hadoop02:2181,hadoop03:2181";

    private static final int sessionTimeout = 2000;

    private static ZooKeeper zk = null;

    public static void main(String[] args) throws Exception {
        //调用create
        //create();

        //获取子节点
        //getChildren();

        //判断是否存在
        //isExist();

        //获取znode数据
        //getData();

        //删除
        //delete();

        //修改
        setData();
    }

    /**
     * 获取zookeeper实例
     * @return
     * @throws Exception
     */
    public static ZooKeeper getZookeeper() throws Exception {
        zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                // 收到watch通知后的回调函数
                System.out.println("事件类型" + event.getType() + ",路径" + event.getPath());

                //因为监听器只会监听一次,这样可以一直监听,且只监听"/"目录
                try {
                    zk.getChildren("/", true);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        return zk;
    }

    /**
     * 创建数据
     * @throws Exception
     */
    public static void create() throws Exception {
        ZooKeeper zk = getZookeeper();
        //创建一个节点,返回创建好的路径 ,且上传的数据可以为任意类型,需要转换成byte[]
        //参数1 路径,参数2 内容,参数3 权限,参数4 类型
        String znodePath = zk.create("/mytest", "hello zookeeper".getBytes(), Ids.OPEN_ACL_UNSAFE,
            CreateMode.EPHEMERAL);
        System.out.println("返回的路径 为:" + znodePath);
    }

    /**
     * 判断znode是否存在
     * @throws Exception
     */
    public static void isExist() throws Exception {
        ZooKeeper zk = getZookeeper();
        Stat exists = zk.exists("/lijie", false);
        if (exists == null) {
            System.out.println("不存在");
        } else {
            System.out.println("存在");
        }
    }

    /**
     * 获取子节点
     * @throws Exception
     */
    public static void getChildren() throws Exception {
        ZooKeeper zk = getZookeeper();
        //获取子节点
        List<String> children = zk.getChildren("/", true);
        for (String string : children) {
            System.out.println("子节点:" + string);
        }
        //阻塞,测试监听器,且只监听"/"目录
        Thread.sleep(Long.MAX_VALUE);
    }

    /**
     * 获取znode数据
     * @throws Exception
     */
    public static void getData() throws Exception {
        ZooKeeper zk = getZookeeper();
        byte[] data = zk.getData("/lijie/test", false, new Stat());
        System.out.println(new String(data));
    }

    /**
     * 删除数据
     * @throws Exception
     */
    public static void delete() throws Exception {
        ZooKeeper zk = getZookeeper();
        //第二个参数为version,-1表示删除所有版本
        //它不支持删除的节点下面还有子节点,只能递归删除
        zk.delete("/hehe", -1);
    }

    /**
     * 修改znode的值
     * @throws Exception
     */
    public static void setData() throws Exception {
        ZooKeeper zk = getZookeeper();

        //修改znode的值
        zk.setData("/lijie", "modify data".getBytes(), -1);

        //测试是否修改成功
        System.out.println(new String(zk.getData("/lijie", false, null)));

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值