0 課程地址
https://coding.imooc.com/lesson/201.html#mid=12720
1 重點關注
1.1 本節內容
java api客戶端修改節點,只做了同步修改,異步修改方式如1.3,可以參考6-3異步新增
1.2 java api 修改節點同步修改
/**
* 參數:
* path:節點路徑
* data:數據
* version:數據狀態 從服務端獲取到的版本號dataversion
*/
Stat status = zkServer.getZookeeper().setData("/testnode", "xyz".getBytes(),0);
System.out.println(status.getVersion());
1.3 java api 修改節點異步調用(回調函數)
/**
* The asynchronous version of setData.
*
* @see #setData(String, byte[], int)
*/
public void setData(final String path, byte data[], int version,
StatCallback cb, Object ctx)
{
}
2 課程內容
3 Coding
3.1 java api 新增節點同步調用Demo
- 啓動服務端
進入到
cd /usr/local/zookeeper/bin
重啓zookeeper服務端
./zkServer.sh restart
啓動客戶端,查看version
--啓動linux zk客戶端
zkCli.sh -server localhost:2181
--查看版本
get /testnode
output:
testnode
cZxid = 0x81
ctime = Sat Mar 30 17:40:22 CST 2024
mZxid = 0x81
mtime = Sat Mar 30 17:40:22 CST 2024
pZxid = 0x81
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
- 運行java類,修改節點
package com.imooc.zk.demo;
import java.io.IOException;
import java.util.List;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;
/**
*
* @Title: ZKConnectDemo.java
* @Description: zookeeper 操作demo演示
*/
public class ZKNodeOperator implements Watcher {
private ZooKeeper zookeeper = null;
public static final String zkServerPath = "172.26.139.4:2181";
public static final Integer timeout = 5000;
public ZKNodeOperator() {}
public ZKNodeOperator(String connectString) {
try {
zookeeper = new ZooKeeper(connectString, timeout, new ZKNodeOperator());
} catch (IOException e) {
e.printStackTrace();
if (zookeeper != null) {
try {
zookeeper.close();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
/**
*
* @Title: ZKOperatorDemo.java
* @Description: 創建zk節點
*/
public void createZKNode(String path, byte[] data, List<ACL> acls) {
String result = "";
try {
/**
* 同步或者異步創建節點,都不支持子節點的遞歸創建,異步有一個callback函數
* 參數:
* path:創建的路徑
* data:存儲的數據的byte[]
* acl:控制權限策略
* Ids.OPEN_ACL_UNSAFE --> world:anyone:cdrwa
* CREATOR_ALL_ACL --> auth:user:password:cdrwa
* createMode:節點類型, 是一個枚舉
* PERSISTENT:持久節點
* PERSISTENT_SEQUENTIAL:持久順序節點
* EPHEMERAL:臨時節點
* EPHEMERAL_SEQUENTIAL:臨時順序節點
*/
// result = zookeeper.create(path, data, acls, CreateMode.EPHEMERAL);
String ctx = "{'create':'success'}";
zookeeper.create(path, data, acls, CreateMode.PERSISTENT, new CreateCallBack(), ctx);
System.out.println("創建節點:\t" + result + "\t成功...");
new Thread().sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
ZKNodeOperator zkServer = new ZKNodeOperator(zkServerPath);
// 創建zk節點
//zkServer.createZKNode("/testnode", "testnode".getBytes(), Ids.OPEN_ACL_UNSAFE);
/**
* 參數:
* path:節點路徑
* data:數據
* version:數據狀態 從服務端獲取到的版本號dataversion
*/
Stat status = zkServer.getZookeeper().setData("/testnode", "xyz".getBytes(),0);
System.out.println(status.getVersion());
/**
* 參數:
* path:節點路徑
* version:數據狀態
*/
// zkServer.createZKNode("/test-delete-node", "123".getBytes(), Ids.OPEN_ACL_UNSAFE);
// zkServer.getZookeeper().delete("/test-delete-node", 2);
// String ctx = "{'delete':'success'}";
// zkServer.getZookeeper().delete("/test-delete-node", 0, new DeleteCallBack(), ctx);
// Thread.sleep(2000);
}
public ZooKeeper getZookeeper() {
return zookeeper;
}
public void setZookeeper(ZooKeeper zookeeper) {
this.zookeeper = zookeeper;
}
@Override
public void process(WatchedEvent event) {
}
}
- 打印日誌:
1
- linux 連接zk客戶端,驗證臨時節點已創建
--連接服務端
zkCli.sh -server localhost:2181
--查看節點版本及數據是否修改
get /testnode
--output:
xyz
cZxid = 0x81
ctime = Sat Mar 30 17:40:22 CST 2024
mZxid = 0x86
mtime = Sun Mar 31 06:54:31 CST 2024
pZxid = 0x81
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0