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();
}