zookeeper Watcher ZK状态 事件类型

来源:互联网 发布:logstash 性能优化 编辑:程序博客网 时间:2024/06/06 21:42

 Watcher ZK状态 事件类型

zookeeper有Watch事件,是一次性出发的,当watch 监视的数据发生变化时,通知设置了该watch的client,即Watcher

同样,其Watcher事监听数据发送了某些变化,那就一定会有对应的事件类型和状态类型

事件类型:(znode节点相关)

EventType.NodeCreated

EventType.NodeDateChanged

EventType.NodeChildrenchanged

EventType.NodeDeleted

状态类型:(是跟客户端实例相关的) Flow 与 Leader Watcher 

KeeperState:Disconnected

KeeperState:SyncConnected

KeeperState:AuthFailed

KeeperState:Expired


c1 c2 相当于client 通过建立一个线程watch 事件监听 zookeeper节点的变化 所以C1 C2 相当于 Watcher ,而且client端可以有多个Watcher 一个Watcher监控一个节点,但Watch事件,是一次性出发的,如果一直监控节点的话 要重复的进行watch。

下面我们通过代码来看一下:

/** * Zookeeper Wathcher  * 本类就是一个Watcher类(实现了org.apache.zookeeper.Watcher类) */public class ZooKeeperWatcher implements Watcher {/** 定义原子变量 */AtomicInteger seq = new AtomicInteger();/** 定义session失效时间 */private static final int SESSION_TIMEOUT = 10000;/** zookeeper服务器地址 */private static final String CONNECTION_ADDR = "192.168.80.88:2181";/** zk父路径设置 */private static final String PARENT_PATH = "/testWatch";/** zk子路径设置 */private static final String CHILDREN_PATH = "/testWatch/children";/** 进入标识 */private static final String LOG_PREFIX_OF_MAIN = "【Main】";/** zk变量 */private ZooKeeper zk = null;/** 信号量设置,用于等待zookeeper连接建立之后 通知阻塞程序继续向下执行 */private CountDownLatch connectedSemaphore = new CountDownLatch(1);/** * 创建ZK连接 * @param connectAddr ZK服务器地址列表 * @param sessionTimeout Session超时时间 */public void createConnection(String connectAddr, int sessionTimeout) {this.releaseConnection();try {zk = new ZooKeeper(connectAddr, sessionTimeout, this);System.out.println(LOG_PREFIX_OF_MAIN + "开始连接ZK服务器");connectedSemaphore.await();} catch (Exception e) {e.printStackTrace();}}/** * 关闭ZK连接 */public void releaseConnection() {if (this.zk != null) {try {this.zk.close();} catch (InterruptedException e) {e.printStackTrace();}}}/** * 创建节点 * @param path 节点路径 * @param data 数据内容 * @return  */public boolean createPath(String path, String data) {try {//设置监控(由于zookeeper的监控都是一次性的所以 每次必须设置监控)this.zk.exists(path, true);System.out.println(LOG_PREFIX_OF_MAIN + "节点创建成功, Path: " +    this.zk.create(/**路径*/    path,    /**数据*/   data.getBytes(),    /**所有可见*/   Ids.OPEN_ACL_UNSAFE,    /**永久存储*/   CreateMode.PERSISTENT ) +    ", content: " + data);} catch (Exception e) {e.printStackTrace();return false;}return true;}/** * 读取指定节点数据内容 * @param path 节点路径 * @return */public String readData(String path, boolean needWatch) {try {return new String(this.zk.getData(path, needWatch, null));} catch (Exception e) {e.printStackTrace();return "";}}/** * 更新指定节点数据内容 * @param path 节点路径 * @param data 数据内容 * @return */public boolean writeData(String path, String data) {try {System.out.println(LOG_PREFIX_OF_MAIN + "更新数据成功,path:" + path + ", stat: " +this.zk.setData(path, data.getBytes(), -1));} catch (Exception e) {e.printStackTrace();}return false;}/** * 删除指定节点 *  * @param path *            节点path */public void deleteNode(String path) {try {this.zk.delete(path, -1);System.out.println(LOG_PREFIX_OF_MAIN + "删除节点成功,path:" + path);} catch (Exception e) {e.printStackTrace();}}/** * 判断指定节点是否存在 * @param path 节点路径 */public Stat exists(String path, boolean needWatch) {try {return this.zk.exists(path, needWatch);} catch (Exception e) {e.printStackTrace();return null;}}/** * 获取子节点 * @param path 节点路径 */private List<String> getChildren(String path, boolean needWatch) {try {return this.zk.getChildren(path, needWatch);} catch (Exception e) {e.printStackTrace();return null;}}/** * 删除所有节点 */public void deleteAllTestPath() {if(this.exists(CHILDREN_PATH, false) != null){this.deleteNode(CHILDREN_PATH);}if(this.exists(PARENT_PATH, false) != null){this.deleteNode(PARENT_PATH);}}/** * 收到来自Server的Watcher通知后的处理。 */@Overridepublic void process(WatchedEvent event) {System.out.println("进入 process 。。。。。event = " + event);try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}if (event == null) {return;}// 连接状态KeeperState keeperState = event.getState();// 事件类型EventType eventType = event.getType();// 受影响的pathString path = event.getPath();String logPrefix = "【Watcher-" + this.seq.incrementAndGet() + "】";System.out.println(logPrefix + "收到Watcher通知");System.out.println(logPrefix + "连接状态:\t" + keeperState.toString());System.out.println(logPrefix + "事件类型:\t" + eventType.toString());if (KeeperState.SyncConnected == keeperState) {// 成功连接上ZK服务器if (EventType.None == eventType) {System.out.println(logPrefix + "成功连接上ZK服务器");connectedSemaphore.countDown();} //创建节点else if (EventType.NodeCreated == eventType) {System.out.println(logPrefix + "节点创建");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}this.exists(path, true);} //更新节点else if (EventType.NodeDataChanged == eventType) {System.out.println(logPrefix + "节点数据更新");System.out.println("我看看走不走这里........");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(logPrefix + "数据内容: " + this.readData(PARENT_PATH, true));} //更新子节点else if (EventType.NodeChildrenChanged == eventType) {System.out.println(logPrefix + "子节点变更");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(logPrefix + "子节点列表:" + this.getChildren(PARENT_PATH, true));} //删除节点else if (EventType.NodeDeleted == eventType) {System.out.println(logPrefix + "节点 " + path + " 被删除");}else ;} else if (KeeperState.Disconnected == keeperState) {System.out.println(logPrefix + "与ZK服务器断开连接");} else if (KeeperState.AuthFailed == keeperState) {System.out.println(logPrefix + "权限检查失败");} else if (KeeperState.Expired == keeperState) {System.out.println(logPrefix + "会话失效");}else ;System.out.println("--------------------------------------------");}/** * <B>方法名称:</B>测试zookeeper监控<BR> * <B>概要说明:</B>主要测试watch功能<BR> * @param args * @throws Exception */public static void main(String[] args) throws Exception {//建立watcherZooKeeperWatcher zkWatch = new ZooKeeperWatcher();//创建连接zkWatch.createConnection(CONNECTION_ADDR, SESSION_TIMEOUT);//System.out.println(zkWatch.zk.toString());Thread.sleep(1000);// 清理节点zkWatch.deleteAllTestPath();if (zkWatch.createPath(PARENT_PATH, System.currentTimeMillis() + "")) {Thread.sleep(1000);// 读取数据System.out.println("---------------------- read parent ----------------------------");//zkWatch.readData(PARENT_PATH, true);// 读取子节点System.out.println("---------------------- read children path ----------------------------");zkWatch.getChildren(PARENT_PATH, true);// 更新数据zkWatch.writeData(PARENT_PATH, System.currentTimeMillis() + "");Thread.sleep(1000);// 创建子节点zkWatch.createPath(CHILDREN_PATH, System.currentTimeMillis() + "");Thread.sleep(1000);zkWatch.writeData(CHILDREN_PATH, System.currentTimeMillis() + "");}Thread.sleep(50000);// 清理节点zkWatch.deleteAllTestPath();Thread.sleep(1000);zkWatch.releaseConnection();}}


 下节链接地址http://blog.csdn.net/lm324114/article/details/78388638

1 0
原创粉丝点击