pom.xml配置如下
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.7</version>
</dependency>
</dependencies>
java代码展示:
import com.alibaba.fastjson.JSONObject;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@SpringBootTest
class ZookeeperServiceApplicationTests {
private static final Logger log = LoggerFactory.getLogger(ZookeeperServiceApplicationTests.class);
@Test
void contextLoads() {
}
@Test
public ZooKeeper testConnect() {
try {
//连接操作是异步的(非阻塞连接),如果不做任何处理,可能导致还没连接成功,testConnect方法线程就已经关闭了。
//这里使用递减锁来处理
final CountDownLatch cdl = new CountDownLatch(1);
//ip端口,连接超时时间,监听者
ZooKeeper zk = new ZooKeeper("zookeeper服务器ip地址:2181", 5000, new Watcher() {
@Override
public void process(WatchedEvent event) {
if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {
//System.out.println("连接成功!");
log.warn("连接成功!");
cdl.countDown();
}
}
});
cdl.await();
return zk;
} catch (Exception e) {
log.error("zookeeper connection occure error!", e);
}
return null;
}
@Test
public void zookeeperOpreation() {
try {
ZooKeeper zk = testConnect();
Stat stat = new Stat();
stat.setVersion(0);
byte[] byteDate = zk.getData("/junglon", null, stat);
log.warn("/junglon 下的数据是:" + JSONObject.toJSONString(new String(byteDate)));
//创建节点
//参数:节点,存储数据,权限,节点类型
zk.create("/junglon", "MsGao".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//如果不需要确认当前数据版本,则传入版本号为-1
zk.setData("/junglon", "JUNGLON".getBytes(), 0);
//删除数据
//版本号传-1,则直接删除节点
zk.delete("/junglon", -1);
//获取子节点
//参数:节点,监听者
List<String> list = zk.getChildren("/", null);
for (String str : list) {
log.warn("获取的所有子节点:list = " + JSONObject.toJSONString(list));
}
} catch (Exception e) {
log.error("deal data is error !", e);
}
}
}
对节点进行事件监听
事件类型:
None(-1),
NodeCreated(1),
NodeDeleted(2),
NodeDataChanged(3),
NodeChildrenChanged(4);
对节点进行事件监听,此处以getData方法为例,可以自行选择监听事件类型
zk.getData("/junglon", new Watcher() {
@Override
public void process(WatchedEvent event) {
if(event.getType() == EventType.NodeDataChanged) {
System.out.println("节点数据改变了!");
}
}
}, null);
注意zookeeper中监听默认是一次性的。要想永久监听需要自己处理。
永久监听代码:仅供参考
//永久监听
//监听事件的类型从EventType中选择
for(;;) {
final CountDownLatch countdl = new CountDownLatch(1);
zk.getData("/junglon", new Watcher() {
@Override
public void process(WatchedEvent event) {
if(event.getType() == EventType.NodeDeleted) {
System.out.println("节点数据删除了!");
countdl.countDown();
}
}
}, null);
countdl.await();
}