通过代码操作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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章