Zookeeper03之javaAPI的使用

本文介绍了如何在Java项目中使用Zookeeper的API,包括创建项目并导入相关jar包,详细讲解了API的简单使用如创建节点、检查节点存在性、获取子节点和内容、修改及删除节点。此外,还探讨了监听器的使用,如连接监听器、子节点变化监听器和节点数据变化监听器的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Zookeeper03之javaAPI的使用

Java程序操作Zookeeper

1.创建java项目并导入相关jar包

主要jar包在主目录下

image.png

项目需要的相关依赖的jar包在zookeeper的解压文件的lib目录下就有

image.png

maven项目坐标

    <dependencies>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

2.API简单使用

2.1配置Zookeeper对象

ps:一定要把超时时间设置长一点,不然显示连接成功,但操作可能失败,还一直找不要原因。

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

/**
 * @author: cjw
 * @date 2019/8/8 10:33
 * 功能:
 */
public class Test01 {

    // zookeeper的服务器地址
//    private String connectString = "192.168.197.131:2181,192.168.197.132:2181,192.168.197.133:2181";
    private String connectString = "192.168.197.131:2181,192.168.197.132:2181";
    // 连接超时时间,足够长(必须)
    private int sessionTimeout = 20000;
    private ZooKeeper zk = null;


    /**
     * 设置zookeeper对象
     * @throws IOException
     */
    @Before
    public void setZookeeper() throws IOException {

        zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            /**
             * 事件触发的回调方法
             */
            @Override
            public void process(WatchedEvent event) {

            }
        });
        System.out.println("---"+zk);
    }

    /**
     * 功能:测试连接成功
     */
    @Test
    public void Test(){
        ZooKeeper.States state = zk.getState();
        System.out.println(state.isAlive());
        System.out.println(state.toString());
        System.out.println(state.name());
    }

}

Test()运行截图

图片.png

常用API操作

添加节点
 /**
     * create 方法参数
     *    第一个参数 路径
     *    第二个参数  值  bytes
     *    第三个参数  对节点的访问控制
     *    第四个参数  节点的类型 短暂  永久  序号
     * @throws KeeperException
     * @throws InterruptedException
     */
    @Test
    public void create() throws KeeperException, InterruptedException {
        String s = zk.create("/node5", "cjw".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(s);
    }

对节点的访问控制

选项含义
ZooDefs.Ids.OPEN_ACL_UNSAFE开放的ACL不安全
ZooDefs.Ids.ANYONE_ID_UNSAFE任何ID不安全
ZooDefs.Ids.AUTH_IDS身份验证id
ZooDefs.Ids.CREATOR_ALL_ACL创造者所有ACL
ZooDefs.Ids.READ_ACL_UNSAFE读ACL不安全

图片.png

判断节点是否存在
    /**
     * 判断节点是否存在
     * @throws InterruptedException
     * @throws KeeperException
     */
    @Test
   public void exit() throws KeeperException, InterruptedException {
        // 设置为 true 会调用 zk中的监听器
        Stat exists = zk.exists("/node5", true);
        if(exists == null) {
            System.out.println("该节点不存在!");
        } else {
            System.out.println("该节点存在!");
            System.out.println(exists.getDataLength());
        }
    }

图片.png

获取子节点
/**
     * 获取子节点
     * @throws InterruptedException
     * @throws KeeperException
     */
    @Test
     public void getchildrens() throws KeeperException, InterruptedException {
         List<String> children = zk.getChildren("/", true);
         for (int i = 0; i < children.size(); i++) {
             String s =  children.get(i);
             System.out.println(s);
         }
     }

图片.png

获取节点的内容
 /**
     * 获取节点的内容
     * @throws InterruptedException
     * @throws KeeperException
     */
    @Test
    public void getData() throws KeeperException, InterruptedException {
        byte[] data = zk.getData("/node3", true, null);
        System.out.println(new String(data));
    }

图片.png

修改节点内容
 /**
     * 修改节点内容
     * 	  version -1 自动维护
     * @throws InterruptedException
     * @throws KeeperException
     */
    @Test
    public void update() throws KeeperException, InterruptedException {
        Stat stat = zk.setData("/node3", "相对论".getBytes(), -1);
        System.out.println(stat.getVersion());
    }

图片.png

删除节点
   /**
     * 删除节点
     *    非空节点删除不掉
     * @throws InterruptedException
     * @throws KeeperException
     */
    @Test
    public void remove() throws KeeperException, InterruptedException {
        zk.delete("/node3", 2);
    }

图片.png

3.监听器的使用

监听器是某些方法的必须参数,实现一个 Watcher 接口内部类即可。

连接监听器

在创建连接的时候,可以自定义一个监听器。方便以后用

/**
     * 设置zookeeper对象
     * @throws IOException
     */
    @Before
    public void setZookeeper() throws IOException {

        zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            /**
             * 事件触发的回调方法
             */
            @Override
            public void process(WatchedEvent event) {

            }
        });
        System.out.println("---"+zk);
    }

获取子节点监听器

节点的数量发送改变时,触发监听器。

 /**
     * 监听事件:子节点的数量发生改变时触发(只会触发一次)
     */
    @Test
    public void getchildrens2() throws KeeperException, InterruptedException {
        List<String> children = zk.getChildren("/", new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("子节点的数量发生改变!");
            }
        });
        for (int i = 0; i < children.size(); i++) {
            String s =  children.get(i);
            System.out.println(s);
        }
        Thread.sleep(Long.MAX_VALUE);
    }

图片.png

获取节点数据的监听器

/**
     * 监听事件:节点数据发送改变时触发(只会触发一次)
     */
    @Test
    public void getdata() throws KeeperException, InterruptedException {
        byte[] data = zk.getData("/name2", new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("节点数据发送了改变!");
            }
        }, null);
        System.out.println(new String(data));
        Thread.sleep(Long.MAX_VALUE);
    }

图片.png

项目打包

项目打包 提取码:qxj7 环境:idea

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值