zookeeper快速入门四:在java客户端中操作zookeeper

系列文章:

zookeeper快速入门一:zookeeper安装与启动-CSDN博客

zookeeper快速入门二:zookeeper基本概念-CSDN博客

zookeeper快速入门三:zookeeper的基本操作


先启动zookeeper服务端。

在maven引入zookeeper依赖。

复制代码
<dependency>
   <groupId>org.apache.hadoop</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.3.1</version>
</dependency>

org.apache.zookeeper.Zookeeper是客户端入口主类,负责建立与server的会话。它提供了以下 所示几类主要方法。

在java中启动客户端,注册一个watcher监听链接的建立。

java 复制代码
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

public class ZookeeperClient {
    private static final String connectString = "127.0.0.1:2181";
    private static final int sessionTimeout = 2000;

    private static ZooKeeper zkClient = null;

    public void init() throws Exception {
        zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                // 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)
                System.out.println("zookeeper链接建立");
            }
        });
    }
}

在main方法里测试我们的init方法,用Thread.sleep方法等待zookeeper连接创建,不然在zookeeper客户端建立连接之前主线程就已经退出。

java 复制代码
    public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(5000);
    }

控制台输出:

接下来我们创建一个名为"/java"的节点,节点数据为"data",ZooDefs.Ids.OPEN_ACL_UNSAFE的意思是不节点能被所有人访问,CreateMode.PERSISTENT:节点的类型为持久节点。

java 复制代码
    public void createZnode()throws Exception{
        zkClient.create("/java", "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }

判断节点是否存在,false代表不注册监听事件,如果是true,则注册我们在new zookeeper方法里面传递的watcher。

java 复制代码
    public void testExist() throws Exception{
        Stat stat = zkClient.exists("/java", false);
        System.out.println(stat==null?"节点不存在":"节点存在");
    }

测试一下我们的方法。

    public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(5000);
        new ZookeeperClient().createZnode();
        new ZookeeperClient().testExist();
    }

获取节点的数据。false和上面exists方法参数含义一样,表示不注册连接建立时的watcher,第三个stat对象则存储了除了节点数据之外的其他信息,如czxid、mzxid等。如果为null则表示不保存节点的这些信息。

java 复制代码
    public void getNodeData()throws Exception{
        byte[] res = zkClient.getData("/java",false,new Stat());
        System.out.println(new String(res));
    }

同样测试我们的方法。

java 复制代码
    public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(3000);
        new ZookeeperClient().getNodeData();
    }

获取ACL控制列表

java 复制代码
    public void getACl()throws Exception{
        List<ACL> res = zkClient.getACL("/java",new Stat());
        for(ACL acl : res){
            System.out.println(acl.getId().toString()+acl.getPerms());
        }
    }

测试:

java 复制代码
    public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(3000);
        new ZookeeperClient().getACl();
    }

在/java下创建子节点,获取子节点列表。

java 复制代码
    public void createChildZnode()throws Exception{
        zkClient.create("/java/child", "child data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        zkClient.create("/java/child2", "child2 data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }
    public void getChildNode()throws Exception{
        List<String> res = zkClient.getChildren("/java",false);
        for(String s : res){
            System.out.println(s);
        }
    }

测试:

java 复制代码
    public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(3000);
        new ZookeeperClient().createChildZnode();
        new ZookeeperClient().getChildNode();
    }

全部代码如下:

java 复制代码
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;

import java.util.List;

public class ZookeeperClient {
    private static final String connectString = "127.0.0.1:2181";
    private static final int sessionTimeout = 2000;

    private static ZooKeeper zkClient = null;

    public void init() throws Exception {
        zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                // 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)
                System.out.println("zookeeper链接建立");
            }
        });
    }
    public void createZnode()throws Exception{
        zkClient.create("/java", "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }
    public void createChildZnode()throws Exception{
        zkClient.create("/java/child", "child data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        zkClient.create("/java/child2", "child2 data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }
    public void getChildNode()throws Exception{
        List<String> res = zkClient.getChildren("/java",false);
        for(String s : res){
            System.out.println(s);
        }
    }
    public void testExist() throws Exception{
        Stat stat = zkClient.exists("/java", false);
        System.out.println(stat==null?"节点不存在":"节点存在");
    }
    public void getNodeData()throws Exception{
        byte[] res = zkClient.getData("/java",false,new Stat());
        System.out.println(new String(res));
    }

    public void getACl()throws Exception{
        List<ACL> res = zkClient.getACL("/java",new Stat());
        for(ACL acl : res){
            System.out.println(acl.getId().toString()+acl.getPerms());
        }
    }
    public static void main(String[] args)throws Exception{
        new ZookeeperClient().init();
        Thread.sleep(3000);
        new ZookeeperClient().createChildZnode();
        new ZookeeperClient().getChildNode();
    }

}
相关推荐
songbaoxian4 分钟前
ElasticSearch
java·linux·elasticsearch
非 白18 分钟前
【Java】代理模式
java·开发语言·代理模式
Good Note29 分钟前
Golang的静态强类型、编译型、并发型
java·数据库·redis·后端·mysql·面试·golang
我就是我3521 小时前
记录一次SpringMVC的406错误
java·后端·springmvc
向哆哆1 小时前
Java应用程序的跨平台性能优化研究
java·开发语言·性能优化
ekkcole2 小时前
windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry
java·windows·jar
handsomestWei2 小时前
java实现多图合成mp4和视频附件下载
java·开发语言·音视频·wutool·图片合成视频·视频附件下载
全栈若城2 小时前
03 Python字符串与基础操作详解
java·开发语言·python
伯牙碎琴3 小时前
二、Spring Framework基础:IoC(控制反转)和DI(依赖注入)
java·spring·log4j
菲力蒲LY3 小时前
输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路
java·前端·mybatis