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();
    }

}
相关推荐
Wang's Blog28 分钟前
Java 项目实战: 交友项目 - 黑名单:取消黑名单
java·windows·交友
杨杨杨大侠1 小时前
DeepSeek Harness:连 Agent Loop 都能替换的插件架构
java·人工智能·agent
SL_staff1 小时前
私有化低代码运维三重雷区:JVS开源栈中的Kafka/ES/RabbitMQ治理实践
java·低代码·全栈
yuniko-n1 小时前
【算法】约瑟夫环问题
java·算法
郝亚军1 小时前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
譕痕1 小时前
stripe 实例
java·开发语言·stripe·checksession
墨子夕2 小时前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式
骇客野人2 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维
.Bryce.2 小时前
MCP+A2A+ANP,Agent通信协议的完整知识地图
java·人工智能·后端·agent·通信协议
SL_staff2 小时前
规则引擎选型陷阱:为什么QPS不是JVS-Rules对比Drools的核心指标
java·开源·全栈