package com;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class ZkClient {
private ZooKeeper zookeeper;
/**
* 创建新节点 create
* @throws IOException
*/
@Test
public void create() throws IOException, KeeperException, InterruptedException {
//2.创建新节点
zookeeper.create(
"/testAPI2", //创建节点的路径名
"1234".getBytes(), //存入Zookeeper的数据
ZooDefs.Ids.OPEN_ACL_UNSAFE,//访问控制列表(权限)
CreateMode.PERSISTENT);//节点类型
}
@Before
public void before() throws IOException {
//zookeeper连接地址
String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181,";
//会话响应超时时间
int sessionTimeout = 2000;
//1.创建一个Zookeeper对象
zookeeper = new ZooKeeper(connectString, //Zookeeper地址
sessionTimeout,//超时时间
new Watcher() {
//Zookeeper监听的回调函数
public void process(WatchedEvent watchedEvent) {
}
});
}
@After
public void After() throws InterruptedException {
//3.关闭资源
zookeeper.close();
}
/**
查询 ls
*/
@Test
public void ls() throws KeeperException, InterruptedException {
List<String> ls = zookeeper.getChildren("/", new Watcher() {
public void process(WatchedEvent watchedEvent) {
System.out.println("自定义回调函数");
}
});
for (String l : ls) {
System.out.println(l);
}
//开启监听的情况下,开启线程阻塞,否则守护线程挂掉,无法继续监听
Thread.sleep(Long.MAX_VALUE);
}
/**
查询节点的值 get
*/
@Test
public void get() throws KeeperException, InterruptedException, IOException {
//-s 附加次级信息(节点状态)stat结构体
Stat stat = new Stat();
byte[] data = zookeeper.getData("/testAPI", false, stat);
System.out.println(stat.getDataLength());
System.out.write(data);
System.out.println();
}
/**
查询节点状态 stat
*/
@Test
public void stat() throws KeeperException, InterruptedException {
Stat stat = zookeeper.exists("/testAPI", false);
if (stat == null){
System.out.println("节点不存在");
}else {
System.out.println(stat);
}
}
/**
修改节点 set
*/
@Test
public void set() throws KeeperException, InterruptedException {
String node = "/testAPI";
//确认节点状态
Stat stat = zookeeper.exists(node, false);
//乐观锁
if (stat==null){
System.out.println("节点不存在");
}else {
zookeeper.setData("/testAPI","456".getBytes(),stat.getVersion());
}
}
/**
删除节点
*/
@Test
public void delete() throws KeeperException, InterruptedException {
String node = "/testAPI";
//确认节点状态
Stat stat = zookeeper.exists(node, false);
//乐观锁 version目的是保证,我要修改的和我实际修改的目标是一致的
if (stat==null){
System.out.println("节点不存在");
}else {
zookeeper.delete("/testAPI",stat.getVersion());
}
}
}
log4j.properties
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>zookeeper</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies>
</project>