pom依赖
根据自己的zookeeper版本填写 version,本地使用的zookeeper版本为3.4.6
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
测试各种类型代码如下
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class ZooKeeperApp implements Watcher {
private static Logger logger = LoggerFactory.getLogger(ZooKeeperApp.class);
private static CountDownLatch connected = new CountDownLatch(1);
public static void main(String[] args) throws Exception {
ZooKeeper zk = new ZooKeeper("hadoop:2181", 5000, new ZooKeeperApp());
logger.warn("客户端开始连接zookeeper服务器");
logger.warn("连接状态:{}", zk.getState());
connected.await();//执行到此处挂起,直到连接上往下走
logger.warn("连接状态:" + zk.getState());
createTmpNode(zk);
createTmpNodeCallBack(zk);
updataNode(zk);
deleteNode(zk);
getNode(zk);
isExists(zk);
getChildrenNode(zk);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
logger.warn("接收到watch通知:{}", watchedEvent);
connected.countDown();
}
}
//同步创建临时节点
private static void createTmpNode(ZooKeeper zk) throws Exception {
String path1 = zk.create("/zk-test-eph", "1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
logger.warn("创建节点成功:{}", path1);
Thread.sleep(100000);
/**
* 在命令行工具可以看到刚刚创建的临时节点,注意,临时节点一定要让java在执行状态,否则进程停止后,临时节点小时
* WATCHER::
*
* WatchedEvent state:SyncConnected type:None path:null
* [zk: localhost:2181(CONNECTED) 0] ls /
* [zookeeper, zk-test-eph]
* [zk: localhost:2181(CONNECTED) 1] get /zk-test-eph
* 1
* cZxid = 0x14
* ctime = Mon Sep 30 17:14:24 CST 2019
* mZxid = 0x14
* mtime = Mon Sep 30 17:14:24 CST 2019
* pZxid = 0x14
* cversion = 0
* dataVersion = 0
* aclVersion = 0
* ephemeralOwner = 0x16d816a608c0007
* dataLength = 1
* numChildren = 0
* [zk: localhost:2181
*/
}
/**
* 异步创建ZK节点
* 注意,异步的创建为了查看效果,务必要让进程睡一会
* 否则,因为是异步调用,java进程执行过程中,不会等待结果,直接执行完成。
*/
private static void createTmpNodeCallBack(ZooKeeper zk) throws Exception {
String ctx = "{'create':'success'}";
zk.create("/zk-test-eph", "1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL,
new AsyncCallback.StringCallback() {
@Override
public void processResult(int rc, String path, Object ctx, String name) {
logger.warn("创建节点成功:{}", name);
}
},
ctx
);
Thread.sleep(100000);
}
/**
* 修改节点信息
* setdata函数,正常情况需要指定节点的版本,否则将无法修改成功
* 当我们将版本指定为-1的时候,就可以不用指定版本直接进行修改
*/
private static void updataNode(ZooKeeper zk) throws Exception {
Stat stat = zk.setData("/test", "udpata-test".getBytes(), -1);
logger.warn("版本号:{}", stat.getVersion());
Thread.sleep(100000);
}
/**
* 删除节点
* delete,正常情况需要指定节点的版本,否则将无法删除成功
* 当我们将版本指定为-1的时候,就可以不用指定版本直接进行删除
* 注意,delete函数无返回值
*/
private static void deleteNode(ZooKeeper zk) throws Exception {
zk.delete("/test/test-delete", -1);
}
/**
* zookeeper在创建节点时,务必保障子节点是存在的
* 但是我们可以通过
*/
private static void createPNode(ZooKeeper zk) throws Exception {
String path1 = zk.create("/zk-test-eph/a/b/c", "1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
logger.warn("创建节点成功:{}", path1);
Thread.sleep(100000);
}
private static void getNode(ZooKeeper zk) throws Exception {
Stat stat = new Stat();
byte[] data = zk.getData("/test", true, stat);
logger.warn("获取节点数据:{}", new String(data));
logger.warn("获取节点版本号:{}", stat.getVersion());
}
private static void isExists(ZooKeeper zk) throws Exception {
Stat stat = zk.exists("/test", true);
if (null != stat) {
logger.warn("节点存在");
} else {
logger.warn("节点不存在");
}
}
private static void getChildrenNode(ZooKeeper zk) throws Exception {
List<String> children = zk.getChildren("/test", true);
for (String child : children) {
logger.warn(child);
}
}
}