Zookeeper监听
参考资料
参考这个做一次性的监听
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会通知客户端。
常见的设置监听
- 通过zk.exists(path, true);来设置一次性的zk的watch的监听,该方法不能用于PERSISTENT_SEQUENTIAL,因为路径不确定
- 通过zk.exists(path,Watcher)来对该path设置专门的Watcher,该方法不能用于PERSISTENT_SEQUENTIAL,因为路径不确定
- 通过zk.getChildren(PARENT, true);来对当前节点的所有子节点设置一次性的监听,可以用于PERSISTENT_SEQUENTIALprivate 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端,持续监听母目录下面的节点变化,并且做出相应的相应
客户端,单次触发