Contents
  1. 1. 参考资料
  2. 2. 监听相关
  3. 3. Zookeeper通知机制
  4. 4. 常见的设置监听
  5. 5. 永久性监听的服务端和客户端的实现

参考资料

参考这个做一次性的监听
https://blog.csdn.net/sunnylinner/article/details/52013616

参考这个做永久监听,需要一个专门的zk的server,复制监听和回调,然后不同的client去操作zk,然后被server监听并处理
https://www.jianshu.com/p/9968356828b6

监听相关

事件的类型:

  • EventType.None (zkClient连接服务器连接成功的时候,事件类型为None)
  • EventType.NodeCreated
  • EventType.NodeDeleted
  • EventType.NodeDataChanged
  • EventType.NodeChildrenChanged

Zookeeper通知机制

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

常见的设置监听

  1. 通过zk.exists(path, true);来设置一次性的zk的watch的监听,该方法不能用于PERSISTENT_SEQUENTIAL,因为路径不确定
  2. 通过zk.exists(path,Watcher)来对该path设置专门的Watcher,该方法不能用于PERSISTENT_SEQUENTIAL,因为路径不确定
  3. 通过zk.getChildren(PARENT, true);来对当前节点的所有子节点设置一次性的监听,可以用于PERSISTENT_SEQUENTIAL
    private static final String PARENT = "/name";
    //在zk初始化的时候设置一个全局的Watcher,实现等待初始化的功能
    ZooKeeper zk = new ZooKeeper("127.0.0.1:2181",3000, new Watcher() {
    public void process(WatchedEvent event) {
    System.out.println("已经触发了" + event.getType() + "事件!");
    if ( Event.KeeperState.SyncConnected == event.getState()&&event.getType()==EventType.None) {
    connectedSemaphore.countDown();
    }
    }
    });
    connectedSemaphore.await();
    zk.exists(PARENT+"/rootTest", true);
    zk.create(PARENT+"/rootTest", "mydata".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
    zk.exists(PARENT+"/rootTest", true);
    zk.delete(PARENT+"/rootTest", -1);
    //或者
    zk.getChildren(PARENT, true);
    zk.create(PARENT+"/root", "mydata".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT_SEQUENTIAL);

永久性监听的服务端和客户端的实现

Server端,持续监听母目录下面的节点变化,并且做出相应的相应

public class ZooKeeperServer {
private static final String PARENT = "/name";
public static void main(String[] args) throws Exception {
MyWatcher watch=new MyWatcher();
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181",3000,watch);
watch.setZk(zk);
Thread.sleep(Long.MAX_VALUE);
}
}
//如果根节点为空就创建,不为空就不处理
public class MyWatcher implements Watcher{
private ZooKeeper zk=null;
private static final String PARENT = "/name";
public void setZk(ZooKeeper zk) {
this.zk = zk;
}
public void process(WatchedEvent event) {
String path = event.getPath();
EventType type = event.getType();
System.out.println("路径"+path+"已经触发了" +type + "事件!");
try {
if(zk.exists(PARENT,true)==null){
zk.create(PARENT, "root".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
zk.getChildren(PARENT, true);
} catch (Exception e) {
}
}
}

客户端,单次触发

public class ZooKeeperClient {
private static final String PARENT = "/name";
public static void main(String[] args) throws Exception {
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181",3000,null);
zk.create(PARENT+"/testRootPath", "testRootData".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT_SEQUENTIAL);
zk.close();
}
}

Contents
  1. 1. 参考资料
  2. 2. 监听相关
  3. 3. Zookeeper通知机制
  4. 4. 常见的设置监听
  5. 5. 永久性监听的服务端和客户端的实现