1.Curator Cache 与原生ZooKeeper Wacher区别

原生的ZooKeeper Wacher是一次性的:一个Wacher一旦触发就会被移出,如果你想要反复使用Wacher,就要在Wacher被移除后重新注册,使用起来很麻烦。使用Curator Cache 可以反复使用Wacher了。

2.Curator Cache 和Curator Wacher区别

2.相关类

Curator Cache主要提供了一下三组类,分别用于实现对节点的监听,子节点的监听和二者的混合:

1.NodeCache,NodeCacheListener,ChildData,节点创建,节点数据内容变更,不能监听节点删除。

2.PathChildrenCache,PathChildrenCacheListener,PathChildrenCacheEvent监听指定节点的子节点的变更包括添加,删除,子节点数据数据变更这三类。

3.TreeCache,TreeCacheListener,TreeCacheEvent,TreeCacheSelector

3.节点监听

package cn.francis.maven.hello.ZooKeeper;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.framework.recipes.cache.NodeCacheListener;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.test.TestingServer;
import org.apache.curator.utils.CloseableUtils;
import org.apache.zookeeper.CreateMode; public class NodeCacheDemo {
public static void main(String[]args) throws Exception{
TestingServer server=null;
CuratorFramework client=null;
NodeCache nodeCache=null;
String path="/francis/nodecache/a"; try{
server=new TestingServer();
client= CuratorFrameworkFactory.newClient(server.getConnectString(), new ExponentialBackoffRetry(1000,3));
client.start(); path=client.create().creatingParentsIfNeeded().withProtection().withMode(CreateMode.EPHEMERAL).forPath(path,"init".getBytes()); nodeCache=new NodeCache(client,path,false);
nodeCache.start();
addListener(nodeCache); client.setData().forPath(path,"hello".getBytes());
Thread.sleep(1000);
client.delete().deletingChildrenIfNeeded().forPath(path);
Thread.sleep(Integer.MAX_VALUE); }catch(Exception e){
e.printStackTrace();
}finally{ //这里因为是测试,没有加他们。
//CloseableUtils.closeQuietly(nodeCache);
/// CloseableUtils.closeQuietly(client);
// CloseableUtils.closeQuietly(server);
}
} public static void addListener(NodeCache nodeCache){
//监听类型:节点是否存在,节点数据内容改变,不监听节点删除。
nodeCache.getListenable().addListener(new NodeCacheListener(){ @Override
public void nodeChanged() throws Exception {
// TODO Auto-generated method stub
if(nodeCache.getCurrentData()!=null)
System.out.println("path:"+nodeCache.getCurrentData().getPath()+",data:"+new String(nodeCache.getCurrentData().getData())); }});
}
}

在上面的代码中首先创建了一个节点,然后创建用这个节点路径来创建NodeCache,启动NodeCache,添加NodeCacheListener。然后调用setData来修改节点数据。上面的代码输入如下:

path:/francis/nodecache/_c_d5be73ca-592c-4eda-b7c4-c8ec60ef39a8-a,data:hello

子节点监听:

PathChildrenCache的构造函数如下:

public PathChildrenCache(CuratorFramework client,
String path,
boolean cacheData)
Parameters:
client - the client
path - path to watch
cacheData - if true, node contents are cached in addition to the stat

其中最主要的是cacheData,如果为true,那么当对子节点调用setData时,PathChildrenCache会受到这个CHILD_UPDATED事件。

下面看一下demo:

package cn.francis.maven.hello.ZooKeeper;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.framework.recipes.cache.NodeCacheListener;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent.Type;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.test.TestingServer;
import org.apache.curator.utils.CloseableUtils;
import org.apache.curator.utils.ZKPaths;
import org.apache.hadoop.mapred.join.Parser.TType;
import org.apache.zookeeper.CreateMode; public class NodeCacheDemo {
public static void main(String[]args) throws Exception{
TestingServer server=null;
CuratorFramework client=null;
NodeCache nodeCache=null;
String path="/francis/nodecache/b"; try{
server=new TestingServer();
client= CuratorFrameworkFactory.newClient(server.getConnectString(),new ExponentialBackoffRetry(1000,3));
client.start(); //这里将第三个参数cacheData设置为true,这样当对子节点调用setData时,会受到CHILDREN_UPDATE通知。
PathChildrenCache childrenCache=new PathChildrenCache(client,path,true);


childrenCache.start(StartMode.POST_INITIALIZED_EVENT); childrenCache.getListenable().addListener(new PathChildrenCacheListener(){ @Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
// TODO Auto-generated method stub
if(event.getType()==Type.INITIALIZED){
System.out.println("create"+event.getData().getPath());
}else if(event.getType()==Type.CHILD_ADDED){
System.out.println("create"+event.getData().getPath());
}else if(event.getType()==Type.CHILD_REMOVED){
System.out.println("remove:"+event.getData().getPath());
}else if(event.getType()==Type.CHILD_UPDATED){
//System.out.println("update:"+event.getData().getPath());
System.out.println("update:"+new String(event.getData().getData()));
} }}); //创建父节点
System.out.println(client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path,"init".getBytes()));
Thread.sleep(1000); //创建子节点
String childPath1=ZKPaths.makePath(path, "a");
childPath1=client.create().withMode(CreateMode.PERSISTENT).forPath(childPath1,"1".getBytes());
Thread.sleep(1000); //对子节点赋值
client.setData().forPath(childPath1,"aaa".getBytes());
Thread.sleep(1000); //删除子节点
client.delete().forPath(childPath1);
client.delete().deletingChildrenIfNeeded().forPath("/francis"); Thread.sleep(2000); }catch(Exception e){
e.printStackTrace();
}finally{
CloseableUtils.closeQuietly(nodeCache);
CloseableUtils.closeQuietly(client);
CloseableUtils.closeQuietly(server);
}
}

3.TreeNodeCache

TreeNodeCache将NodeCache和PathChildrenCache功能结合到一起了。他不仅可以对子节点和父节点同时进行监听。如下:

package cn.francis.maven.hello.ZooKeeper;

import java.util.Map;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.framework.recipes.cache.NodeCacheListener;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent.Type;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.test.TestingServer;
import org.apache.curator.utils.CloseableUtils;
import org.apache.curator.utils.ZKPaths;
import org.apache.hadoop.mapred.join.Parser.TType;
import org.apache.zookeeper.CreateMode; public class NodeCacheDemo {
public static void main(String[]args) throws Exception{
TestingServer server=null;
CuratorFramework client=null;
NodeCache nodeCache=null;
String path="/francis/nodecache/b"; try{
server=new TestingServer();
client= CuratorFrameworkFactory.newClient(server.getConnectString(),new ExponentialBackoffRetry(1000,3));
client.start(); TreeCache treeNodeCache=new TreeCache(client,path); treeNodeCache.start(); treeNodeCache.getListenable().addListener(new TreeCacheListener(){ @Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
// TODO Auto-generated method stub
switch(event.getType()){
case NODE_ADDED:
System.out.println("added:"+event.getData().getPath());
break;
case NODE_UPDATED:
System.out.println("updated:"+event.getData().getPath());
break;
case NODE_REMOVED:
System.out.println("removed:"+event.getData().getPath());
break;
default:
System.out.println("other:"+event.getType());
}
} }); //创建父节点
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path,"init".getBytes());
Thread.sleep(1000); //创建子节点
String childPath1=ZKPaths.makePath(path, "a");
childPath1=client.create().withMode(CreateMode.PERSISTENT).forPath(childPath1,"1".getBytes());
Thread.sleep(1000); //对子节点赋值
client.setData().forPath(childPath1,"aaa".getBytes());
Thread.sleep(1000); //对子节点赋值
client.setData().forPath(path,"aaa".getBytes());
Thread.sleep(1000); //删除子节点
client.delete().forPath(childPath1);
client.delete().deletingChildrenIfNeeded().forPath("/francis"); Thread.sleep(2000); }catch(Exception e){
e.printStackTrace();
}finally{ //这里因为是测试,没有加他们。
CloseableUtils.closeQuietly(nodeCache);
CloseableUtils.closeQuietly(client);
CloseableUtils.closeQuietly(server);
}
}
}

输出如下:

other:INITIALIZED
added:/francis/nodecache/b
added:/francis/nodecache/b/a
updated:/francis/nodecache/b/a
updated:/francis/nodecache/b
removed:/francis/nodecache/b/a
removed:/francis/nodecache/b

Curator Cache的更多相关文章

  1. zk 09之:Curator之二:Path Cache监控zookeeper的node和path的状态

    在实际应用开发中,当某个ZNode发生变化后我们需要得到通知并做一些后续处理,Curator Recipes提供了Path Cache 来帮助我们轻松实现watch ZNode. Path Cache ...

  2. Curator Recipes(Cache&Counter)

    Cache 路径缓存(Path Cache) 监视一个ZNode,当子节点增加.更新.删除改变状态时,路径缓存会在本地保存当前子节点及其数据和状态. public PathChildrenCache( ...

  3. Curator框架的使用

    Curator框架的目的是减少用户的复杂度,毕竟原生的Zookeeper难以使用. 这里举一个使用例子. 第一步:建立连接 // 以下代码与192.168.1.101:2181建立了连接Curator ...

  4. Apache Curator: Zookeeper客户端

    Apache Curator Framework url: http://curator.apache.org/curator-framework/ The Curator Framework is ...

  5. Zookeeper开源客户端框架Curator简介

    Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...

  6. (原) 2.3 Curator使用

    本文为原创文章,转载请注明出处,谢谢 Curator使用 1.jar包引入,演示版本为2.6.0,非maven项目,可以下载jar包导入到项目中 <dependency> <grou ...

  7. Zookeeper开源客户端框架Curator简介[转]

    Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...

  8. ZooKeeper(3.4.5) 使用Curator监听事件

    转载:http://www.mamicode.com/info-detail-494364.html 标签: ZooKeeper原生的API支持通过注册Watcher来进行事件监听,但是Watcher ...

  9. 通过Curator操作Zookeeper的简单例子代码

    Curator主要解决了三类问题: 一个是ZooKeeper client与ZooKeeper server之间的连接处理; 一个是提供了一套Fluent风格的操作API; 一个是ZooKeeper各 ...

随机推荐

  1. signalr 配置错误跟踪

    <system.diagnostics> <trace autoflush="true" indentsize="4"> <lis ...

  2. Collection小结

    Collection:

  3. Interleaving String

    https://leetcode.com/problems/interleaving-string/ Given s1, s2, s3, find whether s3 is formed by th ...

  4. ffmpeg 常用命令

    mp4中的h264编码,而h264有两种封装: 一种是annexb模式,传统模式,有startcode,SPS和PPS是在ES中:另一种是mp4模式,一般mp4.mkv.avi会没有startcode ...

  5. cell单选

    先上图给看看效果 cell单选逻辑就是取出上一个选中的cell 设置图片为默认图片 在取出点击的cell 设置图片为选中图片即可 废话不多说直接上代码 p.p1 { margin: 0.0px 0.0 ...

  6. PHP之session与cookie

    1.session与cookie的关系 众所周知,session是存储在服务器端,cookie是存储在客户端,如果禁用了浏览器的cookie功能,很多时候(除非进行了特殊配置)服务器端就无法再读取se ...

  7. NYOJ之题目325 zb的生日

    -------------------------------------- 刷一辈子水题... AC代码: import java.util.Scanner; public class Main { ...

  8. CentOS安装gitLab服务器

    首先利用gitlab-install-el6.sh安装,比较简单: (出处:http://www.linuxidc.com/Linux/2013-06/85754.htm) 1:如果有条件,提供一台全 ...

  9. ***Linux下使用git命令及github项目

    在linux下搭建git环境1.创建Github账号,https://github.com2.Linux创建SSH密钥: ssh-keygen  ##一直默认就可以了 3.将公钥加入到Github账户 ...

  10. Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile

    GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...