溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用Java操作Zookeeper

發(fā)布時(shí)間:2021-04-30 14:41:35 來源:億速云 閱讀:158 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)怎么使用Java操作Zookeeper的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

Java的優(yōu)點(diǎn)是什么

1. 簡單,只需理解基本的概念,就可以編寫適合于各種情況的應(yīng)用程序;2. 面向?qū)ο螅?. 分布性,Java是面向網(wǎng)絡(luò)的語言;4. 魯棒性,java提供自動垃圾收集來進(jìn)行內(nèi)存管理,防止程序員在管理內(nèi)存時(shí)容易產(chǎn)生的錯誤。;5. 安全性,用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須防止病毒的入侵。6. 體系結(jié)構(gòu)中立,只要安裝了Java運(yùn)行時(shí)系統(tǒng),就可在任意處理器上運(yùn)行。7. 可移植性,Java可以方便地移植到網(wǎng)絡(luò)上的不同機(jī)器。8.解釋執(zhí)行,Java解釋器直接對Java字節(jié)碼進(jìn)行解釋執(zhí)行。

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地址和端口號,如果是集群情況下用逗號分割多個(gè)Zookeeper服務(wù)器地址
	//sessionTimeout: 會話超時(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)也會被刪除
	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)聽

Java節(jié)點(diǎn)監(jiān)聽都是永久的,觸發(fā)一次后不會被刪除。

監(jiān)聽節(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);
		}

	});

	//阻塞客戶端,便于測試
	System.in.read();
}

監(jiān)聽節(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)已被刪除");
		}
	});

	//阻塞客戶端,便于測試
	System.in.read();
}

監(jiān)聽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會話過期并且創(chuàng)建了一個(gè)新的會話之后調(diào)用
		@Override
		public void handleNewSession() throws Exception {
			System.out.println("會話過期,已創(chuàng)建新的會話");
		}

		//當(dāng)會話不能重新建立時(shí)調(diào)用
		@Override
		public void handleSessionEstablishmentError(Throwable error) throws Exception {
			error.printStackTrace();
		}
	});

	//阻塞客戶端,便于測試
	System.in.read();
}

感謝各位的閱讀!關(guān)于“怎么使用Java操作Zookeeper”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI