首页 > 编程语言 >ZooKeeper Java API

ZooKeeper Java API

时间:2022-11-10 10:56:33浏览次数:56  
标签:stat Java zk void ZooKeeper public API zk001 节点

ZooKeeper是一个分布式应用程序协调服务,主要用于解决分布式集群中应用系统的一致性问题。它能提供类似文件系统的目录节点树方式的数据存储,主要用途是维护和监控所存数据的状态变化,以实现对集群的管理。

ZooKeeper提供了Java API操作接口

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>

 

package com.xc.xcspringboot.test;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;

/**
 * 对ZooKeeper节点数据的查询、删除和修改
 */
public class NodeTestDemo {

    static ZooKeeper zk;

    static {
        String connectStr = "172.19.25.170:2181,172.19.25.171:2181,172.19.25.172:2181";
        // 参数1:服务器连接字符串
        // 参数2:连接超时时间
        // 参数3:观察者对象(回调方法)
        try {
            zk = new ZooKeeper(connectStr, 3000, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        create();
//        setNodeData();
//        getNodeData();
//        getNodeDataWatch();
//        getNodeDataWatch2();
//        deletePath();
        existsPath();
    }

    /**
     * 创建ZooKeeper节点,并设置元数据
     */
    public static void create() throws Exception {
        /*
         * CreateMode 取值如下:
         * PERSISTENT:持久节点
         * PERSISTENT_SEQUENTIAL:持久顺序节点(自动编号)
         * EPHEMERAL:临时节点,客户端断开连接时,这种节点会被自动删除
         * EPHEMERAL_SEQUENTIAL:临时顺序节点
         */
        String path = zk.create("/zk001", "zk001_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("path " + path);
    }

    /**
     * 修改节点数据
     */
    public static void setNodeData() throws Exception {
        Stat stat = zk.setData("/zk001", "zk001_data_new".getBytes(), -1);
        //输出节点版本号
        System.out.println("输出节点版本号 " + stat.getVersion());
    }

    /**
     * 获取节点元数据
     */
    public static void getNodeData() throws Exception {
        Stat stat = new Stat();
        //返回指定路径上的节点数据和节点状态,节点的状态会放入stat对象中
        byte[] bytes = zk.getData("/zk001", null, stat);
        //输出节点元数据
        System.out.println("输出节点元数据 " + new String(bytes));
    }

    /**
     * 获取节点数据,并加入观察者对象Watcher(一次监听)
     */
    public static void getNodeDataWatch() throws Exception {
        Stat stat = new Stat();
        //返回指定路径上的节点数据和节点状态,节点的状态会放入stat对象中
        byte[] bytes = zk.getData("/zk001", new Watcher() {
            //实现process()方法
            public void process(WatchedEvent event) {
                System.out.println("实现process()方法 " + event.getType());
            }
        }, stat);

        System.out.println("输出节点元数据 " + new String(bytes));
        //改变节点数据,触发watch
        zk.setData("/zk001", "zk001_data_testwatch".getBytes(), -1);
        //为了验证是否触发了watch,不让程序结束
        while (true) {
            Thread.sleep(3000);
        }
    }

    /**
     * 获取节点数据,并加入观察者对象Watcher,实现持续监听
     */
    public static void getNodeDataWatch2() throws Exception {
        final Stat stat = new Stat();
        //定义Watcher对象
        Watcher watcher = new Watcher() {
            //实现process()方法
            public void process(WatchedEvent event) {
                //输出事件类型
                System.out.println("实现process()方法 " + event.getType());
                //重新设置监听,参数this代表当前Watcher对象
                try {
                    zk.getData("/zk001", this, stat);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        //返回指定路径上的节点数据和节点状态,并设置Watcher监听,节点的状态会放入stat对象中
        byte[] bytes = zk.getData("/zk001", watcher, stat);
        System.out.println("输出节点元数据 " + new String(bytes));
        //为了验证是否触发了watch,不让程序结束
        while (true) {
            //改变节点数据,触发watch
            zk.setData("/zk001", "zk001_data_testwatch2".getBytes(), -1);
            Thread.sleep(3000);
        }
    }

    /**
     * 删除节点
     */
    public static void deletePath() throws Exception {
        //删除节点
        zk.delete("/zk001", -1);
    }

    public static void existsPath() throws Exception {
        Stat stat = zk.exists("/zk001", null);
        System.out.println("exists " + stat.toString());
    }

}

  

书籍: Hadoop大数据技术开发实战 6.4 ZooKeeper Java API操作

https://gitee.com/caoyeoo0/xc-springboot/blob/zookeeper/src/main/java/com/xc/xcspringboot/test/NodeTestDemo.java

 

标签:stat,Java,zk,void,ZooKeeper,public,API,zk001,节点
From: https://www.cnblogs.com/ooo0/p/16876341.html

相关文章

  • Java输出SSL握手日志和查看cacerts路径
    在JAVA启动时添加下面的VM参数就可以启动握手日志了!!!-Djavax.net.debug=all另外,在debug日志中,有一个trustStoreis关键字,根据这个可以找到使用的是哪个truststor......
  • 电信AEP物联网平台JAVA SDK对接案例
    在AEP平台中创建应用,在应用详情中可查看AppKey和AppSecret信息。右下角可下载各个版本的sdk,这里我们选中java版本下载。下载的sdk中包含以下信息:demo包里面包含了各个......
  • 小新学Java6-【继承、super、this、抽象类】
    一、继承1.概述:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。其中,多个类可以称为子类,单独那一......
  • 【Javaweb】java中接口(interface)怎么用
    首先我们先了解什么是接口(interface)实际情况中,又是我们必须从几个类中派生出一个子类,继承他们所有的属性和方法。但是,JAVA中是不支持多重继承的,那么为了满足这一目的,就有......
  • HttpWebRequest 使用token访问 IdentityServer保护起来的api
    HttpWebRequestrequest=WebRequest.Create("http://localhost:5001/identity")asHttpWebRequest;request.Method="GET";varheaders=request.Headers;heade......
  • 【java技术总结】java-8新特性:方法引用
    方法引用通过方法的名字来指向一个方法。方法引用可以使语言的构造更紧凑简洁,减少冗余代码。方法引用使用一对冒号::。下面,我们在Car类中定义了4个方法作为例子来......
  • JavaScript错误1
    JavaScript:Failedtoloadresource:theserverrespondedwithastatusof404(NotFound)  解决方法:1.打开idea设置,找到JavaScript保存即可  2.点击ok ......
  • Java组合异步编程(1)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 在《计算机干活的两种方式》中我们提到过同步和异步的区别。所谓同步就是事情只能一件接一件地顺着干,而不能跳过。比如......
  • Java异常
    异常一、异常:就是程序出现不正常的情况。ThrowableErrorExceptionRuntimeException非RuntimeExceptionError:严重问题,不处理Exception:异常类,程序本身可......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验......