Curator實現(xiàn)zookeeper的節(jié)點監(jiān)聽詳解
Curator實現(xiàn)zookeeper的節(jié)點監(jiān)聽
Curtor框架中一共有三個實現(xiàn)監(jiān)聽的方式 一種是NodeCache監(jiān)聽指定節(jié)點 一種是pathChildrenCache監(jiān)聽子節(jié)點 一種是TreeCache可以監(jiān)控所有節(jié)點 相當于以上兩種的合集
引入依賴
<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)建一個測試類 連接好客戶端
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)聽之NodeCache
監(jiān)聽一個指定節(jié)點
@Test
public void testUpdate() throws Exception {
//監(jiān)聽一個節(jié)點
NodeCache nodeCache = new NodeCache(curatorFramework,"/dongwuyuan");
//注冊監(jiān)聽
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("節(jié)點變化了?。。?!");
}
});
//開啟監(jiān)聽 參數(shù) 如果設(shè)置為true 則開啟監(jiān)聽時加載緩存數(shù)據(jù)
nodeCache.start(true);
while (true){
}
}set /dongwuyuan "laohu"

Watch監(jiān)聽之PathChildrenCache
監(jiān)聽子節(jié)點的變化
@Test
public void testPathChildrenCache() throws Exception {
// 參數(shù) 客戶端,路徑 ,緩存數(shù)據(jù),是否壓縮,線程池
PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework,"/dongwuyuan",true);
//綁定監(jiān)聽器
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
System.out.println("子節(jié)點變化了");
System.out.println(pathChildrenCacheEvent);
//監(jiān)聽子節(jié)點的變更,并且拿到變更后的數(shù)據(jù)
PathChildrenCacheEvent.Type type = pathChildrenCacheEvent.getType();
//判斷類型是否是update
if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
//拿到數(shù)據(jù)
byte[] data = pathChildrenCacheEvent.getData().getData();
System.out.println(data);
}
}
});
//開啟監(jiān)聽
pathChildrenCache.start();
while (true){
}
}watch監(jiān)聽之TreeCache
/**
* TreeCache:監(jiān)聽節(jié)點自己和所有子節(jié)點們
*/
@Test
public void testTreeCache(){
//1.創(chuàng)建監(jiān)聽器
TreeCache treeCache = new TreeCache(curatorFramework, "/dongwuyuan");
//2.注冊監(jiān)聽
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
System.out.println("節(jié)點變化了");
System.out.println(event);
}
});
//開啟監(jiān)聽
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)聽一個節(jié)點
NodeCache nodeCache = new NodeCache(curatorFramework,"/dongwuyuan");
//注冊監(jiān)聽
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("節(jié)點變化了!?。?!");
}
});
//開啟監(jiān)聽 參數(shù) 如果設(shè)置為true 則開啟監(jiān)聽時加載緩存數(shù)據(jù)
nodeCache.start(true);
while (true){
}
}
@Test
public void testPathChildrenCache() throws Exception {
// 參數(shù) 客戶端,路徑 ,緩存數(shù)據(jù),是否壓縮,線程池
PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework,"/dongwuyuan",true);
//綁定監(jiān)聽器
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
System.out.println("子節(jié)點變化了");
System.out.println(pathChildrenCacheEvent);
//監(jiān)聽子節(jié)點的變更,并且拿到變更后的數(shù)據(jù)
PathChildrenCacheEvent.Type type = pathChildrenCacheEvent.getType();
//判斷類型是否是update
if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
//拿到數(shù)據(jù)
byte[] data = pathChildrenCacheEvent.getData().getData();
System.out.println(data);
}
}
});
//開啟監(jiān)聽
pathChildrenCache.start();
while (true){
}
}
/**
* TreeCache:監(jiān)聽節(jié)點自己和所有子節(jié)點們
*/
@Test
public void testTreeCache(){
//1.創(chuàng)建監(jiān)聽器
TreeCache treeCache = new TreeCache(curatorFramework, "/dongwuyuan");
//2.注冊監(jiān)聽
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
System.out.println("節(jié)點變化了");
System.out.println(event);
}
});
//開啟監(jiān)聽
try {
treeCache.start();
while (true){
}
} catch (Exception e) {
e.printStackTrace();
}
}
@After
public void close() {
if (curatorFramework != null) {
curatorFramework.close();
}
}
}到此這篇關(guān)于Curator實現(xiàn)zookeeper的節(jié)點監(jiān)聽詳解的文章就介紹到這了,更多相關(guān)zookeeper節(jié)點監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成Redis使用Cache緩存的實現(xiàn)方法
SpringBoot通過配置RedisConfig類和使用Cache注解可以輕松集成Redis實現(xiàn)緩存,主要包括@EnableCaching開啟緩存,自定義key生成器,改變序列化規(guī)則,以及配置RedisCacheManager,本文為使用SpringBoot與Redis處理緩存提供了詳實的指導和示例,感興趣的朋友一起看看吧2024-10-10
mybatisPlus中apply的使用以進行聯(lián)表等復雜sql語句詳解
在MyBatis-Plus中,`apply()`方法可以用于添加任意的SQL片段,包括聯(lián)表查詢,使用`apply()`方法的好處是可以直接添加原生的SQL片段,而不受MyBatis-Plus提供的常規(guī)查詢條件構(gòu)建方法的限制,但是,使用`apply()`方法需要注意安全性和性能問題2025-03-03
Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)(詳細代碼)
這篇文章主要介紹了Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)并附詳細的代碼詳解,需要的小伙伴可以參考一下2022-01-01

