通过这三个操作来绑定事件 :getData、Exists、getChildren
凡是事务类型的操作,都会触发监听事件。create /delete /setData
None (-1), 客户端链接状态发生变化的时候,会收到 none 的事件
NodeCreated (1), 创建节点的事件。
NodeDeleted (2), 删除节点的事件
NodeDataChanged (3), 节点数据发生变更
NodeChildrenChanged (4); 子节点被创建、被删除、会发生事件
增删改查:
package Zookeeper.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* Created by Csh on 2019/1/12.
*/
public class ZookeeperDemo {
public static void main(String[] args) {
final CountDownLatch countDownLatch = new CountDownLatch(1);
try {
ZooKeeper zooKeeper = new ZooKeeper("47.93.63.243:2181", 4000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if(Event.KeeperState.SyncConnected== watchedEvent.getState()){
//如果接收到服务端请求, 连接成功
countDownLatch.countDown();
}
}
});
countDownLatch.await();
//获得连接的状态
System.out.println(zooKeeper.getState());
//添加节点
zooKeeper.create("/user","hh".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
Thread.sleep(1000);
Stat stat = new Stat();
//得到当前节点的值 当前创建的节点不允许跨层级创建, 必须一个一个创建
byte[] data = zooKeeper.getData("/user",null,stat);
System.out.println(new String(data));
// //修改当前节点的值
zooKeeper.setData("/user","10".getBytes(),stat.getVersion());
//得到当前节点的值
byte[] d = zooKeeper.getData("/user",null,stat);
System.out.println(new String(d));
//删除当前节点的值
zooKeeper.delete("/user",stat.getVersion());
zooKeeper.close();
System.in.read();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
}
Watcher
package Zookeeper.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* Created by Csh on 2019/1/12.
*/
public class WatcherDemo {
public static void main(String[] args) {
final CountDownLatch countDownLatch=new CountDownLatch(1);
try {
final ZooKeeper zooKeeper = new ZooKeeper("47.93.63.243:2181", 4000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("默认事件++>>>>>"+watchedEvent.getType());
if(Event.KeeperState.SyncConnected== watchedEvent.getState()){
//如果接收到服务端请求, 连接成功
countDownLatch.countDown();
}
}
});
countDownLatch.await();
//添加节点
zooKeeper.create("/user","hh".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//exists getdata getchildren
//通过exists绑定事件通知
/**
* 当数据发生变更时, zookeeper会产生一个watcher事件, 并且会发送到客户端, 但是客户端只会收到一次通知, 如果后续节点在发生变化
* 不会在将收到通知
*/
Stat stat = zooKeeper.exists("/user", new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println(watchedEvent.getType()+">>"+watchedEvent.getPath());//watcher
try {
//再一次的进行监听 此时的watch为true 默认使用的是全局的事件
zooKeeper.exists(watchedEvent.getPath(),true);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//通过修改的事务类型操作来触发监听事件
stat=zooKeeper.setData("/user","2".getBytes(),stat.getVersion());
Thread.sleep(1000);
zooKeeper.delete("/user",stat.getVersion());
System.in.read();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
}
增删改查:
package Zookeeper.zookeeper.Curator;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
/**
* Created by Csh on 2019/1/12.
*/
public class CuratorDemo {
public static void main(String[] args) {
CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
.connectString("47.93.63.243:2181").sessionTimeoutMs(4000)
.retryPolicy(new ExponentialBackoffRetry(1000,3))
.namespace("user").build();
curatorFramework.start();
try {
//创建节点
curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/test","1".getBytes());
Stat stat = new Stat();
curatorFramework.getData().storingStatIn(stat).forPath("/test");
curatorFramework.setData().withVersion(stat.getVersion()).forPath("/test","12".getBytes());
//删除节点
curatorFramework.delete().deletingChildrenIfNeeded().forPath("/test");
curatorFramework.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Watcher:
package Zookeeper.zookeeper.Curator;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.*;
import org.apache.curator.retry.ExponentialBackoffRetry;
/**
* Created by Csh on 2019/1/12.
*/
public class CuratorWatcherDemo {
public static void main(String[] args) throws Exception {
CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
.connectString("47.93.63.243:2181").sessionTimeoutMs(4000)
.retryPolicy(new ExponentialBackoffRetry(1000,3))
.namespace("user").build();
curatorFramework.start();
//当前节点的创建和删除事件监听
// addListenerWithNodeCache(curatorFramework,"/test");
//子节点的增加、修改、删除的事件监听
// addListenerWithPathChildCache(curatorFramework,"/test");
//综合节点监听事件
addListenerWithTreeCache(curatorFramework,"/test");
System.in.read();
}
/**
* PathChildCache 监听一个节点下子节点的创建、删除、更新
* NodeCache 监听一个节点的更新和创建事件
* TreeCache 综合PatchChildCache和NodeCache的特性
*/
//监听一个节点下自节点的创建删除和更新
public static void addListenerWithChildCache(CuratorFramework curatorFramework,String path){
PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework,path,true);
PathChildrenCacheListener pathChildrenCacheListener = new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
System.out.println(" 接收到---->"+pathChildrenCacheEvent.getType());
}
};
pathChildrenCache.getListenable().addListener(pathChildrenCacheListener);
try {
pathChildrenCache.start(PathChildrenCache.StartMode.NORMAL);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void addListenerWithTreeCache(CuratorFramework curatorFramework,String path) throws Exception {
TreeCache treeCache=new TreeCache(curatorFramework,path);
TreeCacheListener treeCacheListener=new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
System.out.println(event.getType()+"->"+event.getData().getPath());
}
};
treeCache.getListenable().addListener(treeCacheListener);
treeCache.start();
}
public static void addListenerWithNodeCache(CuratorFramework curatorFramework,String path) throws Exception {
final NodeCache nodeCache=new NodeCache(curatorFramework,path,false);
NodeCacheListener nodeCacheListener=new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("Receive Event:"+nodeCache.getCurrentData().getPath());
}
};
nodeCache.getListenable().addListener(nodeCacheListener);
nodeCache.start();
}
}