您好,登錄后才能下訂單哦!
在使用maven項目編寫zookeeper程序時導入相關的jar包:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
1.創建集群連接
//集群節點節點,之間使用逗號隔開
static String url="hadoop01:2181,hadoop02:2181,hadoop03:2181";
//集群編程入口
static ZooKeeper zk;
//超時時間
static long time=5000;
//使用靜態代碼塊,初始化ZooKeeper對象
static {
try {
zk=new ZooKeeper(url,(int)time,null);
} catch (IOException e) {
e.printStackTrace();
}
}
2.創建節點
public void createZnode(ZooKeeper zk){
//必須使用絕對路徑
String path="/test/test04";
//在創建創建節點時,必須指定節點內容
byte data[]="I am a good boy!".getBytes();
try {
/**
* zk.create的四個參數表示:
* arg1:節點路徑
* arg2:節點存放的內容
* arg3:權限設置:默認
* arg4:節點類型(永久無順序、永久有順序、臨時無順序、臨時有順序)
*/
String info = zk.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE
, CreateMode.EPHEMERAL);
System.out.println(info==null?"fail":"success");
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
3.查看節點信息
public void getInfo(ZooKeeper zk,String path){
try {
/**
* zk.getData(path, null, null);
* 參數1:節點的絕對路徑 string
* 參數2:節點的監聽
* 參數3:節點的狀態對象
*/
byte[] data = zk.getData(path, null, null);
System.out.println("節點:"+path+"的信息是:"+(new String(data)));
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
4.修改節點數據
public void updateData(ZooKeeper zk,String path){
try {
/**
* zk.setData(path, data, version);
* path:修改內容的節點
* data:更新的數據
* version:修改的版本:如果不知道,寫-1,表示最新版本
*/
zk.setData(path,"haha".getBytes(),-1);
} catch (Exception e) {
e.printStackTrace();
}
}
5.刪除節點
public void deleteZnode(ZooKeeper zk,String path){
try {
/**
* zk.delete(path, version);
* path:路徑
* version:刪除的版本,如果不知道,寫-1,表示刪除最新版本 int
*/
zk.delete(path,-1);
} catch (Exception e) {
e.printStackTrace();
}
}
6.獲取znode節點的權限信息
public void getACL(ZooKeeper zk,String path){
try {
/**
* zk.getACL(path,stat)
* path:路徑
* stat:狀態信息
*/
List<ACL> acls = zk.getACL(path, null);
for(ACL acl:acls){
System.out.println(acl.getPerms());
}
} catch (Exception e) {
e.printStackTrace();
}
}
7.獲取子節點
public void getChildren(ZooKeeper zk, String path) {
try {
//判斷節點是否存在
if (zk.exists(path, null) == null) {
List<String> childrens = zk.getChildren(path, null);
for(String children:childrens){
//注意這里面收到的都是當前節點下的子節點的相對路徑
System.out.println(children);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
8.znode的測試監聽
public class testZKWatcher {
static String url="hadoop01:2181,hadoop02:2181,hadoop03:2181";
static ZooKeeper zk;
static long time=5000;
static {
try {
zk=new ZooKeeper(url,(int) time,null);
} catch (Exception e) {
e.printStackTrace();
}
}
//設置監聽
public static void liisten(String path,ZooKeeper zk){
try {
zk.exists(path, new Watcher() {
@Override
//WatchedEvent event監聽事件對象
public void process(WatchedEvent event) {
//節點觸發的類型(新增、修改、創建...)
Event.EventType type = event.getType();
//獲取觸發的節點的路徑
event.getPath();
System.out.println("觸發事件的路徑"+path+",觸發的事件的類型"+type);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String path="/test/test01";
liisten(path,zk);
try {
//觸發監聽
zk.create("jj","zzy".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
} catch (Exception e) {
e.printStackTrace();
}
}
}
| 這里需要注意的是,監聽事件是一次性的,如果需要一直監聽,那么需要設置循環監聽。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。