一、JavaAPI提供ZooKeeper添加、查询、修改、删除节点操作
pom文件:
org.apache.zookeeper
zookeeper
3.4.8
代码如下:
public class ConnectionDemo {
public static void main(String[] args) {
try {
final CountDownLatch countDownLatch=new CountDownLatch(1);
ZooKeeper zooKeeper=
new ZooKeeper("192.168.1.200:2181," +
"192.168.1.201:2181,192.168.1.202:2181",
4000, new Watcher() {
@Override
public void process(WatchedEvent event) {
if(Event.KeeperState.SyncConnected==event.getState()){
//如果收到了服务端的响应事件,连接成功
countDownLatch.countDown();
}
}
});
countDownLatch.await();
System.out.println(zooKeeper.getState());//CONNECTED
//添加节点
zooKeeper.create("/zk-persis-cj","0".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
Thread.sleep(1000);
Stat stat=new Stat();
//得到当前节点的值
byte[] bytes=zooKeeper.getData("/zk-persis-cj",null,stat);
System.out.println(new String(bytes));
//修改节点值
zooKeeper.setData("/zk-persis-cj","1".getBytes(),stat.getVersion());
//得到当前节点的值
byte[] bytes1=zooKeeper.getData("/zk-persis-cj",null,stat);
System.out.println(new String(bytes1));
zooKeeper.delete("/zk-persis-cj",stat.getVersion());
zooKeeper.close();
System.in.read();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
}
Watcher监控代码示例:
public class WatcherDemo {
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
final CountDownLatch countDownLatch=new CountDownLatch(1);
final ZooKeeper zooKeeper=
new ZooKeeper("192.168.1.200:2181," +
"192.168.1.201:2181,192.168.1.202:2181",
4000, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("默认事件: "+event.getType());
if(Event.KeeperState.SyncConnected==event.getState()){
//如果收到了服务端的响应事件,连接成功
countDownLatch.countDown();
}
}
});
countDownLatch.await();
zooKeeper.create("/zk-persis-cj","1".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
//exists getdata getchildren
//通过exists绑定事件
Stat stat=zooKeeper.exists("/zk-persis-cj", new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println(event.getType()+"->"+event.getPath());
try {
//再一次去绑定事件
zooKeeper.exists(event.getPath(),true);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//通过修改的事务类型操作来触发监听事件
stat=zooKeeper.setData("/zk-persis-mic","2".getBytes(),stat.getVersion());
Thread.sleep(1000);
zooKeeper.delete("/zk-persis-mic",stat.getVersion());
System.in.read();
}
}
二、Curator的ZooKeeper添加、查询、修改、删除节点操作
pom依赖jar:
org.apache.curator
curator-framework
4.0.0
org.apache.curator
curator-recipes
4.0.0
示例代码:
public class CuratorDemo {
public static void main(String[] args) throws Exception {
CuratorFramework curatorFramework=CuratorFrameworkFactory.
builder().connectString("192.168.1.200:2181," +
"192.168.1.202:2181,192.168.1.202:2181").
sessionTimeoutMs(4000).retryPolicy(new
ExponentialBackoffRetry(1000,3)).
namespace("curator").build();
curatorFramework.start();
//结果: /curator/mic/node1
//原生api中,必须是逐层创建,也就是父节点必须存在,子节点才能创建
curatorFramework.create().creatingParentsIfNeeded().
withMode(CreateMode.PERSISTENT).
forPath("/mic/node1","1".getBytes());
//删除
curatorFramework.delete().deletingChildrenIfNeeded().forPath("/mic/node1");
Stat stat=new Stat();
curatorFramework.getData().storingStatIn(stat).forPath("/mic/node1");
curatorFramework.setData().
withVersion(stat.getVersion()).forPath("/mic/node1","xx".getBytes());
curatorFramework.close();
}
}
Watcher监控代码示例:
public class CuratorWatcherDemo {
public static void main(String[] args) throws Exception {
CuratorFramework curatorFramework=CuratorFrameworkFactory.
builder().connectString("192.168.1.200:2181," +
"192.168.1.201:2181,192.168.1.202:2181").
sessionTimeoutMs(4000).retryPolicy(new
ExponentialBackoffRetry(1000,3)).
namespace("curator").build();
curatorFramework.start();
//当前节点的创建和删除事件监听
addListenerWithNodeCache(curatorFramework,"/cj");
//子节点的增加、修改、删除的事件监听
addListenerWithPathChildCache(curatorFramework,"/cj");
//综合节点监听事件
addListenerWithTreeCache(curatorFramework,"/cj");
System.in.read();
}
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();
}
/**
* PathChildCache 监听一个节点下子节点的创建、删除、更新
* NodeCache 监听一个节点的更新和创建事件
* TreeCache 综合PatchChildCache和NodeCache的特性
*/
public static void addListenerWithPathChildCache(CuratorFramework curatorFramework,String path) throws Exception {
PathChildrenCache pathChildrenCache=new PathChildrenCache(curatorFramework,path,true);
PathChildrenCacheListener pathChildrenCacheListener=new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
System.out.println("Receive Event:"+event.getType());
}
};
pathChildrenCache.getListenable().addListener(pathChildrenCacheListener);
pathChildrenCache.start(PathChildrenCache.StartMode.NORMAL);
}
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();
}
}