通過代碼操作zookeeper

pom.xml配置如下

  <dependencies>
  	 <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.10</version>     
     </dependency> 
   	 <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-simple</artifactId>
         <version>1.6.4</version>
         <scope>compile</scope>
     </dependency> 
     <dependency>
	 	 <groupId>org.apache.zookeeper</groupId>
		 <artifactId>zookeeper</artifactId>
	 	 <version>3.4.7</version>
	 </dependency>
  </dependencies>

java代碼展示:

import com.alibaba.fastjson.JSONObject;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;
import java.util.concurrent.CountDownLatch;

@SpringBootTest
class ZookeeperServiceApplicationTests {

    private static final Logger log = LoggerFactory.getLogger(ZookeeperServiceApplicationTests.class);

    @Test
    void contextLoads() {
    }

    @Test
    public ZooKeeper testConnect() {
        try {
            //連接操作是異步的(非阻塞連接),如果不做任何處理,可能導致還沒連接成功,testConnect方法線程就已經關閉了。
            //這裏使用遞減鎖來處理
            final CountDownLatch cdl = new CountDownLatch(1);
            //ip端口,連接超時時間,監聽者
            ZooKeeper zk = new ZooKeeper("zookeeper服務器ip地址:2181", 5000, new Watcher() {

                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {
                        //System.out.println("連接成功!");
                        log.warn("連接成功!");
                        cdl.countDown();
                    }
                }
            });

            cdl.await();

            return zk;
        } catch (Exception e) {
            log.error("zookeeper connection occure error!", e);
        }
        return null;
    }

    @Test
    public void zookeeperOpreation() {
        try {
            ZooKeeper zk = testConnect();

            Stat stat = new Stat();
            stat.setVersion(0);
            byte[] byteDate = zk.getData("/junglon", null, stat);
            log.warn("/junglon 下的數據是:" + JSONObject.toJSONString(new String(byteDate)));


            //創建節點
            //參數:節點,存儲數據,權限,節點類型
            zk.create("/junglon", "MsGao".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

            //如果不需要確認當前數據版本,則傳入版本號爲-1
            zk.setData("/junglon", "JUNGLON".getBytes(), 0);

            //刪除數據
            //版本號傳-1,則直接刪除節點
            zk.delete("/junglon", -1);

            //獲取子節點
            //參數:節點,監聽者
            List<String> list = zk.getChildren("/", null);

            for (String str : list) {
                log.warn("獲取的所有子節點:list = " + JSONObject.toJSONString(list));
            }
            
        } catch (Exception e) {
            log.error("deal data is error !", e);
        }

    }
}

對節點進行事件監聽

事件類型:

 None(-1),
 NodeCreated(1),
 NodeDeleted(2),
 NodeDataChanged(3),
 NodeChildrenChanged(4);

對節點進行事件監聽,此處以getData方法爲例,可以自行選擇監聽事件類型

zk.getData("/junglon", new Watcher() {
	@Override
	public void process(WatchedEvent event) {
		if(event.getType() == EventType.NodeDataChanged) {
			System.out.println("節點數據改變了!");
		}
	}
}, null);

注意zookeeper中監聽默認是一次性的。要想永久監聽需要自己處理。

永久監聽代碼:僅供參考

//永久監聽
//監聽事件的類型從EventType中選擇
for(;;) {
    final CountDownLatch countdl = new CountDownLatch(1);
    zk.getData("/junglon", new Watcher() {
        @Override
        public void process(WatchedEvent event) {
            if(event.getType() == EventType.NodeDeleted) {
                System.out.println("節點數據刪除了!");
                countdl.countDown();
            }
        }
    }, null);
    countdl.await();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章