有没有读取zookeeper服务连接信息的API?

2021-03-26 19:08发布

2条回答
studentaaa
2021-04-11 14:21

获取数据

客户端可以通过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)

1

2

3

4

这里也有同步和异步接口,

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){


                }

            }

        }

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

运行结果

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

    }

}

一周热门 更多>