zookeeper基础java的API与监听节点数据变化案例

pom依赖:

<dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>

java使用AP:

import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Before;
import org.junit.Test;

public class ZookeeperClientDemo {
	ZooKeeper zk = null;
	@Before
	public void init()  throws Exception{
		// 构造一个连接zookeeper的客户端对象
		zk = new ZooKeeper("hdp-01:2181,hdp-02:2181,hdp-03:2181", 2000, null);
	}
	
	
	@Test
	public void testCreate() throws Exception{

		// 参数1:要创建的节点路径  参数2:数据  参数3:访问权限  参数4:节点类型
		String create = zk.create("/eclipse", "hello eclipse".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
		
		System.out.println(create);
		
		zk.close();
		
	}
	
	
	@Test
	public void testUpdate() throws Exception {
		
		// 参数1:节点路径   参数2:数据    参数3:所要修改的版本,-1代表任何版本
		zk.setData("/eclipse", "我爱你".getBytes("UTF-8"), -1);
		
		zk.close();
		
	}
	
	
	@Test	
	public void testGet() throws Exception {
		// 参数1:节点路径    参数2:是否要监听    参数3:所要获取的数据的版本,null表示最新版本
		byte[] data = zk.getData("/eclipse", false, null);
		System.out.println(new String(data,"UTF-8"));
		
		zk.close();
	}
	
	
	
	@Test	
	public void testListChildren() throws Exception {
		// 参数1:节点路径    参数2:是否要监听   
		// 注意:返回的结果中只有子节点名字,不带全路径
		List<String> children = zk.getChildren("/cc", false);
		
		for (String child : children) {
			System.out.println(child);
		}
		
		zk.close();
	}
	
	
	@Test
	public void testRm() throws InterruptedException, KeeperException{
		
		zk.delete("/eclipse", -1);
		
		zk.close();
	}
	
	
	

}

监听节点数据变化:

import java.util.List;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Before;
import org.junit.Test;

public class ZookeeperWatchDemo {

	ZooKeeper zk = null;

	@Before
	public void init() throws Exception {
		// 构造一个连接zookeeper的客户端对象
		zk = new ZooKeeper("hdp-01:2181,hdp-02:2181,hdp-03:2181", 2000, new Watcher() {

			@Override
			public void process(WatchedEvent event) {

				if (event.getState() == KeeperState.SyncConnected && event.getType() == EventType.NodeDataChanged) {
					System.out.println(event.getPath()); // 收到的事件所发生的节点路径
					System.out.println(event.getType()); // 收到的事件的类型
					System.out.println("节点数据发生了变化....."); // 收到事件后,我们的处理逻辑

					try {
						zk.getData("/myNode", true, null);

					} catch (KeeperException | InterruptedException e) {
						e.printStackTrace();
					}
				}else if(event.getState() == KeeperState.SyncConnected && event.getType() == EventType.NodeChildrenChanged){
					
					System.out.println("子节点变化了......");
				}

			}
		});
	}

	@Test
	public void testGetWatch() throws Exception {

		byte[] data = zk.getData("/myNode", true, null); // 监听节点数据变化
		
		List<String> children = zk.getChildren("/myNode", true); //监听节点的子节点变化事件

		System.out.println(new String(data, "UTF-8"));

		Thread.sleep(Long.MAX_VALUE);

	}

}
经验分享 程序员 微信小程序 职场和发展