Zookeeper安装
zookeeper的安装在之前的文章中已经写过:https://blog.csdn.net/qq_45587153/article/details/123630361?spm=1001.2014.3001.5502
导入POM依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
测试方法
package com.shen.zk;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.List;
public class TestZookeeper {
public static void main (String[] args) throws Exception {
//create();
//list();
//get();
delete();
}
/**
* 删除节点
* 删除节点前,需要先查询节点的状态cversion,通过getData来查询这个版本
* 设计的目的是保证删除的节点是自己想删除的那个
*/
public static void delete() throws Exception{
ZooKeeper zooKeeper = new ZooKeeper("129.211.65.241:2181", 10000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("delete监听");
}
});
Stat stat = new Stat();
System.out.println(stat);
zooKeeper.getData("/parent/sequence0000000001",false,stat);
System.out.println(stat);
zooKeeper.delete("/parent/sequence0000000001", stat.getCversion());
}
/**
* 查询节点中存储的数据,相当于根据key获取value
*/
public static void get() throws Exception{
ZooKeeper zooKeeper = new ZooKeeper("129.211.65.241:2181", 10000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("get方法监听");
}
});
//获取数据
byte[] datas = zooKeeper.getData("/parent",false,null);
System.out.println("节点/parent中存储的数据是:" + new String(datas));
}
/**
* 查询节点相当于遍历
* @throws Exception
*/
public static void list() throws Exception{
ZooKeeper zooKeeper = new ZooKeeper("129.211.65.241:2181", 10000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("list方法监听");
}
});
listAll(zooKeeper,"/");
//遍历zk中所有节点
List<String> res = zooKeeper.getChildren("/",false);
for (String str : res){
System.out.println(str);
}
}
/**
* 递归遍历所有节点
*/
private static void listAll(ZooKeeper zooKeeper,String path) throws Exception{
//获取当前节点所有字节点
List<String> children = zooKeeper.getChildren(path,false);
for(String child : children){
String currentNodeName = "/".equals(path) ? (path + child) : (path + "/" + child);
System.out.println(currentNodeName);
listAll(zooKeeper,currentNodeName);
}
}
/**
* 创建节点
* 什么是会话?
* 持久,长期,有状态的对象,多次请求响应
* 使用java远程访问zk,步骤:
* 1,创建客户端
* 2,使用客户端发送命令
* 3,处理返回结果
* 4,回收资源
*/
public static void create() throws IOException, InterruptedException, KeeperException {
//客户端对象
ZooKeeper zooKeeper = new ZooKeeper("129.211.65.241:2181", 10000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("watch方法执行");
}
});
//创建一个节点
String result = zooKeeper.create("/parent","parent data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("创建parent节点结果:"+ result);
//创建一个临时节点
String tmpResult = zooKeeper.create("/parent/tmp",null,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
System.out.println("创建/parent/tmp节点结果:" + tmpResult);
//创建一个带序号的节点
String seqResult = zooKeeper.create("/parent/sequence",null,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println("创建/parent/sequence节点结果:" + seqResult);
Thread.sleep(6000);
//关闭客户端
zooKeeper.close();
}
}