zk有四种节点类型:

持久节点,持久顺序节点,临时节点,临时顺序节点。

自定义监听事件时,在节点的创建,修改,删除的方法第一行都需要加入是否监听的一个方法:

//开启监听的方法。第二个参数表示是否开启监听
zk.exists(path, true);

zk自定义监听:

package com.kf.zkDemo;

import java.io.IOException;
import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
/**
* 自定义zk的事件通知
* @author kf
*
*/
public class MyWatch implements Watcher{
//定义链接地址
private static String ADDRESS = "127.0.0.1:2181";
//超时时间
private static int TIMEOUT = 2000; ZooKeeper zk;
//阻塞用户线程,用户必须等待连接成功
private CountDownLatch countDownLatch = new CountDownLatch(1); public void createZkConnection(String address, int timeout){
//第三个参数是事件通知。这里用的是本类,自定义的事件通知
try {
zk = new ZooKeeper(address, timeout, this);
countDownLatch.countDown();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建节点内容
* @param path
* @param data
* @return
*/
public boolean createNode(String path, String data){
//第三个参数表示权限的,这里开放所有权限,不限制服务器
//第四个参数表示节点的类型。用的持久节点
try {
//开启监听的方法。第二个参数表示是否开启监听
zk.exists(path, true);
String result = zk.create(path, data.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("创建节点成功!节点为:"+path+",值为:"+data);
System.out.println("创建结果为:"+result);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 修改节点内容
* @param path
* @param data
* @return
*/
public boolean updateNode(String path, String data){
//第三个参数表示权限的,这里开放所有权限,不限制服务器
//第四个参数表示节点的类型。用的持久节点
try {
//开启监听的方法。第二个参数表示是否开启监听
zk.exists(path, true);
//第三个参数表示版本号。 zk的数据版本默认从0开始,每次修改都会加1. -1严格来说属于不合法的版本号。表示从最新版本进行更新
Stat result = zk.setData(path, data.getBytes(), -1);
System.out.println("修改节点成功!节点为:"+path+",修改后为值为:"+data);
System.out.println("修改节点成功,result:"+result);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
} public boolean deleteNode(String path){
//第二个参数表示版本号
try {
//开启监听的方法。第二个参数表示是否开启监听
zk.exists(path, true);
//第二个参数表示版本号。 zk的数据版本默认从0开始,每次修改都会加1. -1严格来说属于不合法的版本号。表示从最新版本进行更新
zk.delete(path, -1);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
} public void process(WatchedEvent event) {
System.out.println("事件通知开始前");
//事件路径
String path = event.getPath();
//事件状态 即 连接不连接
KeeperState state = event.getState();
//事件类型
EventType type = event.getType();
System.out.println("事件路径"+path+",事件状态"+state+",事件类型"+type);
if(KeeperState.SyncConnected == state){
//事件类型 None表示是连接类型
if(EventType.None == type){
System.out.println("连接类型");
//连接上zk服务器后放开信号量
countDownLatch.countDown();
System.out.println("=====ZK连接成功=====");
}else if(EventType.NodeCreated == type){
System.out.println("=====新增节点成功=====path:"+path);
}else if(EventType.NodeDataChanged == type){
System.out.println("=====修改节点成功=====path:"+path);
}else if(EventType.NodeDeleted == type){
System.out.println("=====删除节点成功=====path:"+path);
}
}
System.out.println("事件通知开始后");
} public static void main(String[] args) {
MyWatch w = new MyWatch();
w.createZkConnection(ADDRESS, TIMEOUT);
//w.createNode("/zk01", "zk01-value");
//w.updateNode("/zk01", "zk01-value2");
w.deleteNode("/zk01");
} }

初学zookeeper--自定义事件监听的更多相关文章

  1. [问题贴]mui.openWindow+自定义事件监听操作让alert()执行两次

    仔细看,Alert函数执行了两次 共两个页面:index.html和detail.html, detail.html为按钮设置了自定义事件监听(newsId),触发alert. 在index.html ...

  2. Zookeeper Curator 事件监听 - 秒懂

    目录 写在前面 1.1. Curator 事件监听 1.1.1. Watcher 标准的事件处理器 1.1.2. NodeCache 节点缓存的监听 1.1.3. PathChildrenCache ...

  3. Java Spring 自定义事件监听

    ApplicationContext 事件 定义一个context的起动监听事件 import org.springframework.context.ApplicationListener; imp ...

  4. cocos2d-js 自定义事件监听派发

    熟悉js的dom事件或者flash事件的,基本都能立马明白cc.eventManager的用法. cc.eventManager有两种注册监听器的方式,一种是原生事件,例如 cc.eventManag ...

  5. JAVA自定义事件监听完整例子---sunfruit[转]

    http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f733628a854d2c90c05f9313071601 ...

  6. Spring Boot实践——事件监听

    借鉴:https://blog.csdn.net/Harry_ZH_Wang/article/details/79691994 https://blog.csdn.net/ignorewho/arti ...

  7. SpringBoot框架(6)--事件监听

    一.场景:类与类之间的消息通信,例如创建一个对象前后做拦截,日志等等相应的事件处理. 二.事件监听步骤 (1)自定义事件继承ApplicationEvent抽象类 (2)自定义事件监听器,一般实现Ap ...

  8. 关于实现自定义Dialog和实现Dialog里view的事件监听的两种方法

    一.自定义dialog. 二.实现dialog里view的事件监听 1.自定义dialog比较简单.在实例化new的时候,加入样式,布局就行了.或者重写dialog. 2.实现dialog里view的 ...

  9. [置顶] flex4事件监听与自定义事件分发(三)

    1.我们来说一下自定义事件子类.什么时候创建新的事件类以及怎么创建. (1)说一下,我们什么时候需要自定义事件类.举例说明,在flex中事件的基类是Event,而当我们点击某个按钮或者是单击某个组件的 ...

随机推荐

  1. drf序列化器serializers.SerializerMethodField()的用法

    问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...

  2. 【sonar-block】Use try-with-resources or close this "BufferedInputStream" in a "finally" clause.

    自己的理解: try-with-resources是JDK7的新语法结构,主要功能是自动关闭资源而不需要在finally里面手动close()关闭, 而且最重要的是,try块中的异常不会被close( ...

  3. 牛客挑战赛30D 小A的昆特牌(组合数学)

    题面 传送门 题解 很容易写出一个暴力 \[\sum_{i=l}^r {i+n-1\choose n-1}{s-i+m\choose m}\] 即枚举选了多少个步兵,然后用插板法算出方案数 我们对这个 ...

  4. [Swift实际操作]八、实用进阶-(8)使用performSegue在故事板页面之间进行数据传递

    本文将演示故事板页面之间的数据传递.首先在一个空白项目中,打开项目自带的故事板文件(Main.storyboard).故事板中已经拥有了一个视图控制器,点击选择该视图控制器.然后依此点击[Editor ...

  5. Elasticsearch 因拷贝多余的jar到lib库导致无法启动的问题

    因为需要测试,无意中拷贝了一个netty-buffer-4.1.16.Final.jar包放到es的lib目录下,晚上回家启动es的时候发现启动不起来了.检查日志发现如下错误. 其中有一句关键语句 C ...

  6. appium+android各配置参数获取'platformName'、'platformVersion'、appActivity、deviceName、webdriver.Remote

    图中1的获取--'platformName'.'platformVersion' 点击appium右上角的运行按钮,可通过上面查看platformName 和 platformVersion 平台版本 ...

  7. php 多字节编码转换

    PHP 支持的编码 mb_convert_encoding — 转换字符的编码 string mb_convert_encoding ( string $str , string $to_encodi ...

  8. 洛谷 P4248 / loj 2377 [AHOI2013] 差异 题解【后缀自动机】【树形DP】

    可能是一个 SAM 常用技巧?感觉 SAM 的基础题好多啊.. 题目描述 给定一个长度为 \(n\) 的字符串 \(S\) ,令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀,求: \[ ...

  9. EXTJS文档地址

    文档地址:http://docs.sencha.com/extjs/4.2.3/#!/api/Ext.form.field.Field-event-change

  10. CentOS7 MongoDB安装及基本配置

    一.安装包的获取 1.创建文件: vi /etc/yum.repos.d/mongodb-org-4.0.repo 2.在上一步创建的文件中,写入如下内容: [mongodb-org-4.0] nam ...