一、Watcher的使用
package ygsoft.gris.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.util.concurrent.CountDownLatch;
/**
* 事件实现原理;
*/
public class WatcherDemo {
public static void main(String[] args) {
try {
CountDownLatch countDownLatch = new CountDownLatch(1);
ZooKeeper zooKeeper = new ZooKeeper("192.168.80.33:2181,192.168.80.36:2181,192.168.80.39:2181",
4000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("全局监听器:" + watchedEvent.getPath() + "->" + watchedEvent.getType());
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
countDownLatch.countDown();
}
}
});
countDownLatch.await();
System.out.println(zooKeeper.getState());
//定义路径
final String path = "/zookeeper-persis-thomas";
//创建节点
zooKeeper.create(path, "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
Stat stat = zooKeeper.exists(path, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("自定义监听器:" + watchedEvent.getPath() + "->" + watchedEvent.getType());
try {
//第二参数传入为true是,表示默认执行全局的监听器
zooKeeper.exists(path, true);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//修改操作时触发监听器
stat = zooKeeper.setData(path, "1".getBytes(), stat.getVersion());
//删除时触发监听器
zooKeeper.delete(path, stat.getVersion());
zooKeeper.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//代码演示:
二、事件触发
//特性:当数据发生变更时,zookeeper会产生一个watch事件,并且会发送到客户端。但是客户端只会接收到一次通知。
//如果后续这个节点再次发生变更,那么之前设置watch的客户端不会再接收到消息,可以通过循环监听从而达到永久监听的效果
//===如何注册事件机制
//getData Exsits getChildren 来绑定事件
//===如何触发事件
//凡是事务类型操作都会触发,如create/setData/delete