中間件 ZK分佈式專題與Dubbo微服務入門 6-5 同步異步刪除zk節點

0    課程地址

https://coding.imooc.com/lesson/201.html#mid=12721

 

1    重點關注

1.1    本節內容

java api客戶端刪除節點,包含同步修改和異步修改,只做了異步,同步不通用(因爲沒有回調函數,不知道是否刪除成功)也可以參照視頻看下

 

1.2    java api 刪除節點同步修改

zkServer.getZookeeper().delete("/test-delete-node", 2);

 

 

1.3    java api 刪除節點異步調用(回調函數)

        String ctx = "{'delete':'success'}";
        zkServer.getZookeeper().delete("/test-delete-node", 0, new DeleteCallBack(), ctx);


package com.imooc.zk.demo;


import org.apache.zookeeper.AsyncCallback.VoidCallback;

public class DeleteCallBack implements VoidCallback {
    @Override
    public void processResult(int rc, String path, Object ctx) {
        System.out.println("刪除節點" + path);
        System.out.println((String)ctx);
    }

}

 

 

 

2    課程內容

 

 

3    Coding

3.1    java api 刪除節點異步調用Demo

  • 啓動服務端
    進入到
cd /usr/local/zookeeper/bin

 
    重啓zookeeper服務端
./zkServer.sh restart

 

  • 運行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) {
    }
}

 

  • 回調類:
package com.imooc.zk.demo;


import org.apache.zookeeper.AsyncCallback.VoidCallback;

public class DeleteCallBack implements VoidCallback {
    @Override
    public void processResult(int rc, String path, Object ctx) {
        System.out.println("刪除節點" + path);
        System.out.println((String)ctx);
    }

}

 

  • 打印日誌:
創建節點: /test-delete-node
{'create':'success'}
創建節點:        成功...
刪除節點/test-delete-node
{'delete':'success'}

 

 

  •  linux 連接zk客戶端,驗證臨時節點已刪除(斷點形式驗證,新增時查看下節點,刪除後查看下節點)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章