如何使用Java操作Zookeeper
簡(jiǎn)介
Java操作Zookeeper有很多種方式,如zookeeper、zkclient、curator等等,下面介紹下使用zkclient的方式操作Zookeeper。
Maven依賴:
<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.11</version> </dependency>
使用zkclient操作Zookeeper
創(chuàng)建節(jié)點(diǎn):
@Test public void testCreateNode() { //建立連接 //zkServers: Zookeeper服務(wù)器IP地址和端口號(hào),如果是集群情況下用逗號(hào)分割多個(gè)Zookeeper服務(wù)器地址 //sessionTimeout: 會(huì)話超時(shí)時(shí)間 //connectionTimeout: 連接超時(shí)時(shí)間 ZkClient zkClient = new ZkClient("127.0.0.1:2181", 60000, 5000); //創(chuàng)建數(shù)據(jù) Student student = new Student(); student.setName("張三"); student.setAge(18); student.setPhone("1585454xxxx"); //創(chuàng)建持久節(jié)點(diǎn) zkClient.createPersistent("/p_node", student); //創(chuàng)建持久順序節(jié)點(diǎn) zkClient.createPersistentSequential("/ps_node", student); //創(chuàng)建臨時(shí)節(jié)點(diǎn) zkClient.createEphemeral("/e_node", student); //創(chuàng)建臨時(shí)順序節(jié)點(diǎn) zkClient.createEphemeralSequential("/ps_node", student); //關(guān)閉客戶端 //關(guān)閉客戶端的同時(shí),前面創(chuàng)建的臨時(shí)節(jié)點(diǎn)也會(huì)被刪除 zkClient.close(); }
讀取節(jié)點(diǎn)數(shù)據(jù):
@Test public void testReadNodeData() { ZkClient zkClient = new ZkClient("127.0.0.1:2181", 60000, 5000); Stat stat = new Stat(); Student student = zkClient.readData("/p_node", stat); System.out.println("節(jié)點(diǎn)狀態(tài)信息:" + JSON.toJSONString(student)); System.out.println("節(jié)點(diǎn)數(shù)據(jù):" + JSON.toJSONString(stat)); zkClient.close(); } //輸出結(jié)果: //節(jié)點(diǎn)狀態(tài)信息:{"age":18,"name":"張三","phone":"1585454xxxx"} //節(jié)點(diǎn)數(shù)據(jù):{"aversion":0,"ctime":1619165355431,"cversion":0,"czxid":165,"dataLength":260,"ephemeralOwner":0,"mtime":1619165355431,"mzxid":165,"numChildren":0,"pzxid":165,"version":0}
刪除節(jié)點(diǎn):
@Test public void testDeleteNode() { ZkClient zkClient = new ZkClient("127.0.0.1:2181", 60000, 5000); //刪除節(jié)點(diǎn),不能刪除帶有子節(jié)點(diǎn)的節(jié)點(diǎn) zkClient.delete("/p_node"); //刪除節(jié)點(diǎn),遞歸刪除所有子孫節(jié)點(diǎn) zkClient.deleteRecursive("/p_node2"); zkClient.close(); }
更新節(jié)點(diǎn)數(shù)據(jù):
@Test public void testWriteNodeData() { ZkClient zkClient = new ZkClient("127.0.0.1:2181", 60000, 5000); //更新節(jié)點(diǎn)數(shù)據(jù) zkClient.writeData("/p_node", "myData1"); //使用CAS更新節(jié)點(diǎn)數(shù)據(jù) //zkClient.writeData("/p_node", "myData2", 1); zkClient.close(); }
獲取子節(jié)點(diǎn)列表:
@Test public void testGetChildNodes() { ZkClient zkClient = new ZkClient("127.0.0.1:2181", 60000, 5000); //獲取子節(jié)點(diǎn)列表 List<String> childList = zkClient.getChildren("/p_node"); childList.stream().forEach(System.out::println); zkClient.close(); }
節(jié)點(diǎn)監(jiān)聽(tīng)
Java節(jié)點(diǎn)監(jiān)聽(tīng)都是永久的,觸發(fā)一次后不會(huì)被刪除。
監(jiān)聽(tīng)節(jié)點(diǎn)的子節(jié)點(diǎn)變化:
@Test public void testSubscribeChildChanges() throws IOException { ZkClient zkClient = new ZkClient("127.0.0.1:2181", 60000, 5000); zkClient.subscribeChildChanges("/p_node", new IZkChildListener(){ //子節(jié)點(diǎn)改變時(shí)調(diào)用 @Override public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { System.out.println(parentPath + "子節(jié)點(diǎn)發(fā)生改變"); System.out.println("當(dāng)前子節(jié)點(diǎn)列表:" + currentChilds); } }); //阻塞客戶端,便于測(cè)試 System.in.read(); }
監(jiān)聽(tīng)節(jié)點(diǎn)數(shù)據(jù)變化:
@Test public void testSubscribeDataChanges() throws IOException { ZkClient zkClient = new ZkClient("127.0.0.1:2181", 60000, 5000); zkClient.subscribeDataChanges("/p_node", new IZkDataListener(){ //節(jié)點(diǎn)數(shù)據(jù)改變時(shí)調(diào)用 @Override public void handleDataChange(String dataPath, Object data) throws Exception { System.out.println(dataPath + "節(jié)點(diǎn)數(shù)據(jù)發(fā)生變化"); System.out.println("修改后的數(shù)據(jù)為:" + data.toString()); } //節(jié)點(diǎn)被刪除時(shí)調(diào)用 @Override public void handleDataDeleted(String dataPath) throws Exception { System.out.println(dataPath + "節(jié)點(diǎn)已被刪除"); } }); //阻塞客戶端,便于測(cè)試 System.in.read(); }
監(jiān)聽(tīng)Zookeeper連接狀態(tài)變化:
@Test public void testSubscribeStateChanges() throws IOException { ZkClient zkClient = new ZkClient("127.0.0.1:2181", 60000, 5000); zkClient.subscribeStateChanges(new IZkStateListener(){ //當(dāng)zookeeper連接狀態(tài)改變時(shí)調(diào)用 @Override public void handleStateChanged(Watcher.Event.KeeperState state) throws Exception { System.out.println("當(dāng)前狀態(tài)" + state); } //在zookeeper會(huì)話過(guò)期并且創(chuàng)建了一個(gè)新的會(huì)話之后調(diào)用 @Override public void handleNewSession() throws Exception { System.out.println("會(huì)話過(guò)期,已創(chuàng)建新的會(huì)話"); } //當(dāng)會(huì)話不能重新建立時(shí)調(diào)用 @Override public void handleSessionEstablishmentError(Throwable error) throws Exception { error.printStackTrace(); } }); //阻塞客戶端,便于測(cè)試 System.in.read(); }
以上就是如何使用Java操作Zookeeper的詳細(xì)內(nèi)容,更多關(guān)于Java操作Zookeeper的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot初始化啟動(dòng)報(bào)錯(cuò)Error?creating?bean?with?name?'da
這篇文章主要為大家介紹了Springboot初始化啟動(dòng)報(bào)Error?creating?bean?with?name?'dataSource'?defined?in?class?path?resource解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08java web實(shí)現(xiàn)簡(jiǎn)單留言板功能
這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)簡(jiǎn)單留言板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11基于SpringBoot+Redis實(shí)現(xiàn)一個(gè)簡(jiǎn)單的限流器
在Spring?Boot中使用Redis和過(guò)濾器實(shí)現(xiàn)請(qǐng)求限流,過(guò)濾器將在每個(gè)請(qǐng)求到達(dá)時(shí)檢查請(qǐng)求頻率,并根據(jù)設(shè)定的閾值進(jìn)行限制,這樣可以保護(hù)您的應(yīng)用程序免受惡意請(qǐng)求或高并發(fā)請(qǐng)求的影響,本文我們通過(guò)Spring?Boot?+Redis?實(shí)現(xiàn)一個(gè)輕量級(jí)的消息隊(duì)列,需要的朋友可以參考下2023-08-08一個(gè)簡(jiǎn)易的Java多頁(yè)面隊(duì)列爬蟲(chóng)程序
這篇文章主要為大家詳細(xì)介紹了一個(gè)多頁(yè)面的java爬蟲(chóng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Java常用面板之JScrollPane滾動(dòng)面板實(shí)例詳解
這篇文章主要介紹了Java常用面板JScrollPane的簡(jiǎn)單介紹和一個(gè)相關(guān)實(shí)例,,需要的朋友可以參考下。2017-08-08