zookeeper watcher示例
示例说明:zookeeper server端,client端每100毫秒写入数据,另一个client端watch节点数据变化。
server端
参考这篇的server端。
http://xkorey.iteye.com/blog/2201301
数据生成端
public void increase(){
int inx=0;
try {
zk = new ZooKeeper("localhost:22801",2000,new ZKWatcher());
if(zk.exists(path,false)==null){
zk.create(path,new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
}
while (run){
zk.setData(path,(""+(inx++)).getBytes(),-1);
Thread.sleep(100);
}
System.out.println("maker ext. the value is:"+inx);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
watch端
public class ZKEventCatcher implements Watcher, AsyncCallback.StatCallback{
String path = "/test_data_increase";
ZooKeeper zk=null;
Object o =new Object();
public void init(){
try {
zk = new ZooKeeper("localhost:8610",3000,this);
zk.exists(path,this);
synchronized (o){
o.wait();
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public void processResult(int i, String s, Object o, Stat stat) {
boolean exists;
switch (KeeperException.Code.get(i)) {
case OK:
exists = true;
break;
case NONODE:
exists = false;
break;
case SESSIONEXPIRED:
case NOAUTH:
return;
default:
zk.exists(s, true, this, stat);
return;
}
if(exists){
try {
String val = new String(zk.getData(path,false,null));
System.out.println(val);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void process(WatchedEvent event) {
String path = event.getPath();
if (event.getType() == Event.EventType.None) {
switch (event.getState()) {
case SyncConnected:
break;
case Expired:
break;
}
} else {
if (path != null) {
zk.exists(path, true, this, null);
}
}
}
public static void main(String[]args){
ZKEventCatcher catcher = new ZKEventCatcher();
catcher.init();
}
}
监听的结果是得到的数值是连续的、和数据生成端是一致的,并没有出现数值跳跃的情况。
结论:只要实现Watcher, AsyncCallback.StatCallback2 个类的方法。节点值变化zookeeper会触发这2个回调函数。所以只要在一开始exists的watcher设定为自己(this)。然后wait()就可以了。
官方链接:
http://zookeeper.apache.org/doc/trunk/javaExample.html
分享到:
相关推荐
apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper...
赠送jar包:zookeeper-3.4.10.jar; 赠送原API文档:zookeeper-3.4.10-javadoc.jar; 赠送源代码:zookeeper-3.4.10-sources.jar; 赠送Maven依赖信息文件:zookeeper-3.4.10.pom; 包含翻译后的API文档:zookeeper-...
zookeeper-3.4.14,包含添加系统服务插件及添加bat. 1. zookeeper-3.4.14源包 2. commons-daemon-1.1.0-bin-windows.zip 插件 3. 配置好插件的zookeeper-3.4.14包,右键管理员权限执行zk-server-install.bat
apache-zookeeper-3.6.0.tar.gz
zookeeper-3.4.9.tar.gz
zookeeper-3.4.5-cdh5.16.2.tar.gz 资源包,之前的原网站上无法下载,后经多种途径下载到该资源包,上传到博客上供大家使用。
apache-zookeeper-3.5.7-bin.tar.gz 。
zookeeper-3.4.8zookeeper-3.4.8zookeeper-3.4.8zookeeper-3.4.8
放在压缩包里了, 在windows下解压出"zookeeper-3.4.14.tar.gz"之后上传至虚拟机即可
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 ZooKeeper包含一个简单的原语集,提供Java和C的接口。 ZooKeeper代码版本中,提供了分布式独享锁、选举、...
apache-zookeeper分布式框架,压缩包内容:(apache-zookeeper-3.7.1-bin.tar.gz、apache-zookeeper-3.7.1.tar.gz、apache-zookeeper-3.6.4-bin.tar.gz、apache-zookeeper-3.6.4.tar.gz、apache-zookeeper-3.5.10-...
赠送jar包:zookeeper-3.3.3.jar; 赠送原API文档:zookeeper-3.3.3-javadoc.jar; 赠送源代码:zookeeper-3.3.3-sources.jar; 包含翻译后的API文档:zookeeper-3.3.3-javadoc-API文档-中文(简体)版.zip 对应...
zookeeper-3.4.8.jar
zookeeper-3.4.5.jar; zookeeper-3.4.5.jar; zookeeper-3.4.5.jar;
最新版linux apache-zookeeper-3.7.0-bin.tar.gz最新版linux apache-zookeeper-3.7.0-bin.tar.gz
zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 ...
zookeeper-3.4.6 解压后可直接运行 bin/zkServer.cmd 来启动
zookeeper-3.4.10和zookeeper-3.4.12
apache-zookeeper-3.7.0-bin.tar.gz