微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

zookeeper --- 监听机制示例

 

package com..zookeeper.GWdemo;

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

import java.io.IOException;

/**
 *官网示例: Watcher  监听机制
 */
public class WatcherDemo implements Watcher {
    static ZooKeeper zooKeeper;
    private static Stat stat = new Stat();
    static {
        try {
            zooKeeper = new ZooKeeper("127.0.0.1:2181", 10000,new WatcherDemo());
        } catch (IOException e) {
            e.printstacktrace();
        }
    }
    @Override
    public void process(WatchedEvent event) {
        System.out.println("eventType:"+event.getType());


        if(event.getType()==Event.EventType.NodeDataChanged){
            try {
                zooKeeper.exists(event.getPath(),true);

                //输出更改之后的值
                byte [] bytes = zooKeeper.getData(event.getPath(),true,stat);
                System.out.println(new String(bytes));
            } catch (KeeperException e) {
                e.printstacktrace();
            } catch (InterruptedException e) {
                e.printstacktrace();
            }
        }
    }
    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        String path="/watcher";
        //没有 /watcher 则创建 并赋值为0
        if(zooKeeper.exists(path,false)==null) {
            zooKeeper.create("/watcher", "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }
        Thread.sleep(1000);
        System.out.println("-----------");
        //true表示使用zookeeper实例中配置的watcher
        Stat stat=zooKeeper.exists(path,true);
        system.in.read();
    }
}

 

更改节点数据值为 500000  监听结果:

 

 

 

package com..zookeeper;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.*;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;

/**
 * 简单理解*/
public class Demo1 {

    private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
    private static ZooKeeper zk = null;
    private static Stat stat = new Stat();

    public static void main(String[] args) throws Exception {
        //zookeeper配置数据存放路径
        String path = "/watcher";
        //连接zookeeper并且注册一个认的监听器
        zk = new ZooKeeper("127.0.0.1:2181", 10000, new Watcher() {

                    @Override
                    public void process(WatchedEvent event) {
                        System.out.println("事件类型为:" + event.getType());
                        System.out.println("事件发生的路径:" + event.getPath());
                        System.out.println("通知状态为:" +event.getState());

                        if (KeeperState.SyncConnected == event.getState()) {  //zk连接成功通知事件
                            if (EventType.None == event.getType() && null == event.getPath()) {
                                connectedSemaphore.countDown();
                            } else if (event.getType() == EventType.NodeDataChanged) {  //zk目录节点数据变化通知事件
                                try {
                                    System.out.println("配置已修改,新值为--->:" + new String(zk.getData(event.getPath(), true, stat)));
                                } catch (Exception e) {
                                }
                            }
                        }
                    }
                });
        //等待zk连接成功的通知
        connectedSemaphore.await();

        //没有 /watcher 则创建 并赋值为0
        if(zk.exists(path,false)==null) {
            zk.create("/watcher", "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }

        // 取出子目录节点列表
        System.out.println("子目录节点列表--->"+zk.getChildren(path,true));

        //获取path目录节点的配置数据,并注册认的监听器
        System.out.println("path目录的值--->:"+new String(zk.getData(path, true, stat)));

        Thread.sleep(Integer.MAX_VALUE);
    }


}

 

更改节点数据值为 500000  监听结果:

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐