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é)點 相當(dāng)于以上兩種的合集
引入依賴
<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處理緩存提供了詳實的指導(dǎo)和示例,感興趣的朋友一起看看吧2024-10-10mybatisPlus中apply的使用以進(jìn)行聯(lián)表等復(fù)雜sql語句詳解
在MyBatis-Plus中,`apply()`方法可以用于添加任意的SQL片段,包括聯(lián)表查詢,使用`apply()`方法的好處是可以直接添加原生的SQL片段,而不受MyBatis-Plus提供的常規(guī)查詢條件構(gòu)建方法的限制,但是,使用`apply()`方法需要注意安全性和性能問題2025-03-03Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)(詳細(xì)代碼)
這篇文章主要介紹了Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)并附詳細(xì)的代碼詳解,需要的小伙伴可以參考一下2022-01-01