Zookeeper基础API的操作-获取数据

原创 2018年04月16日 08:29:50

获取数据
客户端可以通过Zookeeper的API来获取一个节点的数据内容,

   void getData(String path, boolean watch, DataCallback cb, Object ctx)
    byte[]  getData(String path, boolean watch, Stat stat)
    void    getData(String path, Watcher watcher, DataCallback cb, Object ctx)
    byte[]  getData(String path, Watcher watcher, Stat stat)

这里也有同步和异步接口,
path:指定数据节点的节点路径,
watcher:注册的watcher,一旦注册节点内容有变更,就会向客户端发送通知,该参数允许传入null
stat:指定数据节点的节点状态信息,用法是在接口中传入一个旧的stat变量,该stat变量会在方法执行过程中,被来自服务端响应的新stat对象替换
Watch:表明是否需要注册一个watcher
Cb:注册一个异步回调函数
Ctx:用于传递上下文信息的对象

同步读取数据

package com.paic.Spark;

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

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * Created by Xlucas on 2018/4/16.
 */
public class ZookeeperDemo7 implements  Watcher{
    private static CountDownLatch connectedSe=new CountDownLatch(1);
    private static ZooKeeper zk=null;
    private  static Stat stat=new Stat();
    public  static void  main(String[] args) throws IOException, InterruptedException, KeeperException {
        String path="/zk-hosts-getDate";
        zk=new ZooKeeper("10.25.76.173", 2000, new ZookeeperDemo7());
        connectedSe.await();
        //创建父节点
        zk.create(path,"get1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        //获取节点数据内容
        System.out.println(new String(zk.getData(path,true,stat)));
        System.out.println(stat.getCzxid()+","+ stat.getMzxid()+","+stat.getVersion());
        zk.setData(path,"123".getBytes(),-1);
        Thread.sleep(Integer.MAX_VALUE);
    }
    @Override
    public void process(WatchedEvent event) {
        //监听路径节点下是否有变化,
        if(Watcher.Event.KeeperState.SyncConnected==event.getState()){
            if (Watcher.Event.EventType.None==event.getType()&&null ==event.getPath()){
                connectedSe.countDown();
            }else if(event.getType()== Event.EventType.NodeDataChanged){
                try{
                    System.out.println(new String(zk.getData(event.getPath(),true,stat)));
                    System.out.println(stat.getCzxid()+","+stat.getMzxid()+","+stat.getVersion());
                }catch (Exception e){

                }
            }
        }
    }
}

运行结果
get1
30064782423,30064782423,0
123
30064782423,30064782424,1

        首先创建一个节点/zk-hosts-getDate,并初始化其数据内容为”get1”,然后调用getData的同步接口来获取/zk-hosts-getDate节点的数据内容,调用的同时注册了一个watcher,之后我们同样以“123”去更新将该节点的数据内容,此时,由于我们之前在该节点上注册了一个watcher,因此,一旦该节点的数据发生变化,Zookeeper服务端就会向客户端发出一个“数据变更”的事件通知,于是,客户端可以在收到这个事件通知后,再次调用getData接口来获取新的数据内容,
        另外,在调用getData接口的同时,我们传入了一个stat变量,在Zookeeper客户端的内部实现中,会从服务端的相应中获取到数据节点的最新节点状态信息,来替换这个客户端的旧状态
        从上面的内容我们可以看到,Czxid为”30064782423”时被创建,在”30064782424”被更新,于是节点的数据版本从”0“到”1”,从这里我们可以知道,数据内容或者是数据版本变化,都会触发服务端的NodeDataChanged通知。

异步读取数据

package com.paic.Spark;

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

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * Created by Xlucas on 2018/4/16.
 */
public class ZookeeperDemo8 implements Watcher {
    private static CountDownLatch connectedSe=new CountDownLatch(1);
    private static ZooKeeper zk=null;
    public  static void  main(String[] args) throws IOException, InterruptedException, KeeperException {
        String path="/zk-hosts-getDate1";
        zk=new ZooKeeper("10.25.76.173", 2000, new ZookeeperDemo8());
        connectedSe.await();
        //创建父节点
        zk.create(path,"get1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        zk.getData(path,true,new DataCallBack(),null);
        zk.setData(path,"123".getBytes(),-1);
        Thread.sleep(Integer.MAX_VALUE);
    }
    @Override
    public void process(WatchedEvent event) {
        if(Event.KeeperState.SyncConnected==event.getState()){
            if(Event.EventType.None==event.getType()&&null==event.getPath()){
                connectedSe.countDown();
            }else if(event.getType()== Event.EventType.NodeDataChanged){
                try {
                    zk.getData(event.getPath(),true,new DataCallBack(),null);
                }catch (Exception e){

                }
            }
        }
    }
}

package com.paic.Spark;

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

/**
 * Created by Xlucas on 2018/4/16.
 */
public class DataCallBack implements AsyncCallback.DataCallback {
    @Override
    public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
        System.out.println(rc+", "+path+", "+new String(data));
        System.out.println(stat.getCzxid()+", "+stat.getMzxid()+", "+stat.getVersion());
    }
}

运行结果
0, /zk-hosts-getDate1, get1
30064782449, 30064782449, 0
0, /zk-hosts-getDate1, 123
30064782449, 30064782450, 1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/paicMis/article/details/79955851

格式化输出数字

格式化输出数字翻译:Cheramiemail:cherami@163.net原文:http://developer.java.sun.com/developer/TechTips/2000/tt041...
  • cherami
  • cherami
  • 2001-10-24 08:51:00
  • 1149

ZooKeeper Java API简单示例

ZooKeeper Java API简单示例
  • lipeng_bigdata
  • lipeng_bigdata
  • 2016-03-26 10:24:10
  • 1571

Zookeeper——2、使用Zookeeper原生API操作Zookeeper

zookeeper的javaclient可以使我们更轻松的实现对zookeeper的各种操作,要使用java操作zookeeper,需要引入zookeeper-3.4.5.jar和zkclient-0...
  • haoyuyang
  • haoyuyang
  • 2016-12-02 17:05:43
  • 4287

Zookeeper命令行以及java API简单使用

安装 关于zookeeper的安装,请参考这篇文章:ZooKeeper伪分布式集群安装及使用我在这里使用的是文中提到的zookeeper伪分布模式的安装和使用。命令行 下面说明命令行方式下使用zo...
  • u010156024
  • u010156024
  • 2015-12-02 19:23:50
  • 4767

ZooKeeper 常用操作API详解

转载:http://www.aboutyun.com/thread-12817-1-1.html 问题导读: 1、ZooKeeper的常用API方法都有那些? 2、Zookeeper 到底能帮我们解...
  • haihongazar
  • haihongazar
  • 2016-09-19 16:48:16
  • 2115

java客户端使用api访问zookeeper,增删改查Znode

  • 2017年02月20日 16:02
  • 2.8MB
  • 下载

Zookeeper 命令行操作及Java api

1.  连接到zookeeper服务 [java2000_wl@localhost zookeeper-3]$ bin/zkCli.sh -server 127.0.0.1:2181 ...
  • z69183787
  • z69183787
  • 2016-11-10 11:01:52
  • 658

zookeeper C API实例

之前一直用zookeeper的java API,最近要用C开发,所以看了C的API及实现 使用zookeeper C API 的步骤: (1)安装zookeeper,直接下载,解压,配置文件即可 ...
  • lpshoucsd1
  • lpshoucsd1
  • 2013-05-28 14:57:07
  • 13923

Zookeeper Java API的使用

本文介绍Zookeeper Java API的使用 引入相应Jar包 bulidPath 解压下载的zookeeper-3.4.9.tar.gz的根目录就有相应jar zookee...
  • MassiveStars
  • MassiveStars
  • 2016-12-19 19:00:52
  • 4542

Zookeeper学习笔记 --- Python操作zookeeper

Zookeeper学习笔记 --- Python操作zookeeper
  • u012965373
  • u012965373
  • 2017-09-08 17:40:20
  • 609
收藏助手
不良信息举报
您举报文章:Zookeeper基础API的操作-获取数据
举报原因:
原因补充:

(最多只允许输入30个字)