Curator實(shí)現(xiàn)zookeeper的節(jié)點(diǎn)監(jiān)聽(tīng)詳解
Curator實(shí)現(xiàn)zookeeper的節(jié)點(diǎn)監(jiān)聽(tīng)
Curtor框架中一共有三個(gè)實(shí)現(xiàn)監(jiān)聽(tīng)的方式 一種是NodeCache監(jiān)聽(tīng)指定節(jié)點(diǎn) 一種是pathChildrenCache監(jiān)聽(tīng)子節(jié)點(diǎn) 一種是TreeCache可以監(jiān)控所有節(jié)點(diǎn) 相當(dāng)于以上兩種的合集
引入依賴(lài)
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>創(chuàng)建一個(gè)測(cè)試類(lèi) 連接好客戶(hù)端
public class CuratorTest {
private CuratorFramework curatorFramework;
@Before
public void testCreate() {
ExponentialBackoffRetry retry = new ExponentialBackoffRetry(2, 10);
curatorFramework = CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181")
.connectionTimeoutMs(60 * 1000)
.sessionTimeoutMs(15 * 10000)
.retryPolicy(retry).build();
curatorFramework.start();
}
@After
public void close() {
if (curatorFramework != null) {
curatorFramework.close();
}
}
}Watch監(jiān)聽(tīng)之NodeCache
監(jiān)聽(tīng)一個(gè)指定節(jié)點(diǎn)
@Test
public void testUpdate() throws Exception {
//監(jiān)聽(tīng)一個(gè)節(jié)點(diǎn)
NodeCache nodeCache = new NodeCache(curatorFramework,"/dongwuyuan");
//注冊(cè)監(jiān)聽(tīng)
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("節(jié)點(diǎn)變化了?。。。?);
}
});
//開(kāi)啟監(jiān)聽(tīng) 參數(shù) 如果設(shè)置為true 則開(kāi)啟監(jiān)聽(tīng)時(shí)加載緩存數(shù)據(jù)
nodeCache.start(true);
while (true){
}
}set /dongwuyuan "laohu"

Watch監(jiān)聽(tīng)之PathChildrenCache
監(jiān)聽(tīng)子節(jié)點(diǎn)的變化
@Test
public void testPathChildrenCache() throws Exception {
// 參數(shù) 客戶(hù)端,路徑 ,緩存數(shù)據(jù),是否壓縮,線程池
PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework,"/dongwuyuan",true);
//綁定監(jiān)聽(tīng)器
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
System.out.println("子節(jié)點(diǎn)變化了");
System.out.println(pathChildrenCacheEvent);
//監(jiān)聽(tīng)子節(jié)點(diǎn)的變更,并且拿到變更后的數(shù)據(jù)
PathChildrenCacheEvent.Type type = pathChildrenCacheEvent.getType();
//判斷類(lèi)型是否是update
if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
//拿到數(shù)據(jù)
byte[] data = pathChildrenCacheEvent.getData().getData();
System.out.println(data);
}
}
});
//開(kāi)啟監(jiān)聽(tīng)
pathChildrenCache.start();
while (true){
}
}watch監(jiān)聽(tīng)之TreeCache
/**
* TreeCache:監(jiān)聽(tīng)節(jié)點(diǎn)自己和所有子節(jié)點(diǎn)們
*/
@Test
public void testTreeCache(){
//1.創(chuàng)建監(jiān)聽(tīng)器
TreeCache treeCache = new TreeCache(curatorFramework, "/dongwuyuan");
//2.注冊(cè)監(jiān)聽(tīng)
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
System.out.println("節(jié)點(diǎn)變化了");
System.out.println(event);
}
});
//開(kāi)啟監(jiān)聽(tīng)
try {
treeCache.start();
while (true){
}
} catch (Exception e) {
e.printStackTrace();
}
}[zk: localhost:2181(CONNECTED) 13] delete /dongwuyuan/node1

[zk: localhost:2181(CONNECTED) 15] set /dongwuyuan/node2 "shizi"

完整代碼
public class CuratorTest {
private CuratorFramework curatorFramework;
@Before
public void testCreate() {
ExponentialBackoffRetry retry = new ExponentialBackoffRetry(2, 10);
curatorFramework = CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181")
.connectionTimeoutMs(60 * 1000)
.sessionTimeoutMs(15 * 10000)
.retryPolicy(retry).build();
curatorFramework.start();
}
@Test
public void testUpdate() throws Exception {
//監(jiān)聽(tīng)一個(gè)節(jié)點(diǎn)
NodeCache nodeCache = new NodeCache(curatorFramework,"/dongwuyuan");
//注冊(cè)監(jiān)聽(tīng)
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("節(jié)點(diǎn)變化了?。。?!");
}
});
//開(kāi)啟監(jiān)聽(tīng) 參數(shù) 如果設(shè)置為true 則開(kāi)啟監(jiān)聽(tīng)時(shí)加載緩存數(shù)據(jù)
nodeCache.start(true);
while (true){
}
}
@Test
public void testPathChildrenCache() throws Exception {
// 參數(shù) 客戶(hù)端,路徑 ,緩存數(shù)據(jù),是否壓縮,線程池
PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework,"/dongwuyuan",true);
//綁定監(jiān)聽(tīng)器
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
System.out.println("子節(jié)點(diǎn)變化了");
System.out.println(pathChildrenCacheEvent);
//監(jiān)聽(tīng)子節(jié)點(diǎn)的變更,并且拿到變更后的數(shù)據(jù)
PathChildrenCacheEvent.Type type = pathChildrenCacheEvent.getType();
//判斷類(lèi)型是否是update
if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
//拿到數(shù)據(jù)
byte[] data = pathChildrenCacheEvent.getData().getData();
System.out.println(data);
}
}
});
//開(kāi)啟監(jiān)聽(tīng)
pathChildrenCache.start();
while (true){
}
}
/**
* TreeCache:監(jiān)聽(tīng)節(jié)點(diǎn)自己和所有子節(jié)點(diǎn)們
*/
@Test
public void testTreeCache(){
//1.創(chuàng)建監(jiān)聽(tīng)器
TreeCache treeCache = new TreeCache(curatorFramework, "/dongwuyuan");
//2.注冊(cè)監(jiān)聽(tīng)
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
System.out.println("節(jié)點(diǎn)變化了");
System.out.println(event);
}
});
//開(kāi)啟監(jiān)聽(tīng)
try {
treeCache.start();
while (true){
}
} catch (Exception e) {
e.printStackTrace();
}
}
@After
public void close() {
if (curatorFramework != null) {
curatorFramework.close();
}
}
}到此這篇關(guān)于Curator實(shí)現(xiàn)zookeeper的節(jié)點(diǎn)監(jiān)聽(tīng)詳解的文章就介紹到這了,更多相關(guān)zookeeper節(jié)點(diǎn)監(jiān)聽(tīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成Redis使用Cache緩存的實(shí)現(xiàn)方法
SpringBoot通過(guò)配置RedisConfig類(lèi)和使用Cache注解可以輕松集成Redis實(shí)現(xiàn)緩存,主要包括@EnableCaching開(kāi)啟緩存,自定義key生成器,改變序列化規(guī)則,以及配置RedisCacheManager,本文為使用SpringBoot與Redis處理緩存提供了詳實(shí)的指導(dǎo)和示例,感興趣的朋友一起看看吧2024-10-10
@TableName注解和@Table的區(qū)別及說(shuō)明
這篇文章主要介紹了@TableName注解和@Table的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
mybatisPlus中apply的使用以進(jìn)行聯(lián)表等復(fù)雜sql語(yǔ)句詳解
在MyBatis-Plus中,`apply()`方法可以用于添加任意的SQL片段,包括聯(lián)表查詢(xún),使用`apply()`方法的好處是可以直接添加原生的SQL片段,而不受MyBatis-Plus提供的常規(guī)查詢(xún)條件構(gòu)建方法的限制,但是,使用`apply()`方法需要注意安全性和性能問(wèn)題2025-03-03
Java枚舉_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
enum 的全稱(chēng)為 enumeration, 是 JDK 5 中引入的新特性,存放在 java.lang 包中。這篇文章給大家介紹Java枚舉相關(guān)知識(shí),需要的的朋友參考下2017-04-04
Java Set集合的遍歷及實(shí)現(xiàn)類(lèi)的比較
這篇文章主要介紹了Java Set集合的遍歷及實(shí)現(xiàn)類(lèi)的比較的相關(guān)資料,需要的朋友可以參考下2017-03-03
Spring學(xué)習(xí)之依賴(lài)注入的方法(三種)
本篇文章主要介紹了Spring學(xué)習(xí)之依賴(lài)注入的方法(三種),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
Eclipse+Java+Swing+Mysql實(shí)現(xiàn)電影購(gòu)票系統(tǒng)(詳細(xì)代碼)
這篇文章主要介紹了Eclipse+Java+Swing+Mysql實(shí)現(xiàn)電影購(gòu)票系統(tǒng)并附詳細(xì)的代碼詳解,需要的小伙伴可以參考一下2022-01-01

