基于Java API对zookeeper的节点操作

1、创建一个maven工程,引入zookeeper jar包,.pom文件中添加以下内容:

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

2、通过Java AIP实现连接Zookeeper,然后打印连接状态,并创建、修改、删除节点

public static void main(String[] args) {
    
    
		try {
    
    
			final CountDownLatch countDownLatch = new CountDownLatch(1);
			
			ZooKeeper zk = new ZooKeeper("192.168.1.102:2181,192.168.1.102:2182,192.168.1.102:2183", 
					4000, new Watcher() {
    
    
						
						@Override
						public void process(WatchedEvent event) {
    
    
							if(Event.KeeperState.SyncConnected == event.getState()) {
    
    
								//收到了服务器端响应事件,连接成功
								countDownLatch.countDown();
							}
							
						}
					});
			
			countDownLatch.await();
			
			System.out.println("zk state:" + zk.getState());
			
			// 创建节点
			zk.create("/zk-demo-test", "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
			Thread.sleep(1000);
			
			Stat stat = new Stat();
			byte[] bytes = zk.getData("/zk-demo-test", null, stat);
			System.out.println("result:" + new String(bytes));
			
			// 修改节点的值
			zk.setData("/zk-demo-test", "1".getBytes(), stat.getVersion());
			
			byte[] bytes1 = zk.getData("/zk-demo-test", null, stat);
			System.out.println("result:" + new String(bytes1));
			
			// 删除节点
			zk.delete("/zk-demo-test", stat.getVersion());
			
			
			zk.close();
		} catch (IOException e) {
    
    
			e.printStackTrace();
		} catch (InterruptedException e) {
    
    
			e.printStackTrace();
		} catch (KeeperException e) {
    
    
			e.printStackTrace();
		}
	}

3、Zookeeper的Watcher事件示例

public static void main(String[] args) {
    
    
		try {
    
    
			final CountDownLatch countDownLatch = new CountDownLatch(1);
			
			final ZooKeeper zk = new ZooKeeper("192.168.1.102:2181,192.168.1.102:2182,192.168.1.102:2183", 
					4000, new Watcher() {
    
    
						
						@Override
						public void process(WatchedEvent event) {
    
    
							System.out.println("default:" + event.getType() + " - " +event.getPath());
							
							if(Event.KeeperState.SyncConnected == event.getState()) {
    
    
								//收到了服务器端响应事件,连接成功
								countDownLatch.countDown();
							}
							
						}
					});
			
			countDownLatch.await();
			
			// 创建节点
			zk.create("/zk-demo-test", "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
			Thread.sleep(1000);
			
			// exists getData getChildren
			Stat stat = zk.exists("/zk-demo-test", new Watcher() {
    
    
				@Override
				public void process(WatchedEvent event) {
    
    
					
					System.out.println(event.getType() + " - " +event.getPath());
					
					try {
    
    
						zk.exists("/zk-demo-test", true);
					} catch (KeeperException e) {
    
    
						e.printStackTrace();
					} catch (InterruptedException e) {
    
    
						e.printStackTrace();
					}
				}
			});
			
			
			stat = zk.setData("/zk-demo-test", "3".getBytes(), stat.getVersion());
			
			Thread.sleep(1000);
			
			zk.delete("/zk-demo-test", stat.getVersion());
			
			System.in.read();
			
			zk.close();
		} catch (IOException e) {
    
    
			e.printStackTrace();
		} catch (InterruptedException e) {
    
    
			e.printStackTrace();
		} catch (KeeperException e) {
    
    
			e.printStackTrace();
		}
		
	}

注:watcher特性:当数据发生变化的时候,zookeeper会产生一个watcher事件,并且会发送到客户端。但是客户端只会收到一次通知。如果后续这个节点再次发生变化,那么之前设置watcher的客户端不会再次收到消息。(watcher是一次性的操作)。可以通过循环监听去达到永久监听效果。

什么样的操作会产生什么类型的事件呢?

zk-demo-che(监听事件) /zk-demo-che/children(监听事件)
create(/zk-demo-che) NodeCreated
delete(/zk-demo-che) NodeDeleted
setData(/zk-demo-che) NodeDataChanged
create(/zk-demo-che/children) NodeChildrenChanged NodeCreated
delete(/zk-demo-che/children) NodeChildrenChanged NodeDeleted
setData(/zk-demo-che/children) NodeDataChanged

zookeeper的节点特性:
1、同一级节点 key 名称是唯一的。
2、创建节点时,必须要带上全路径,节点存在父子关系,必须有先后。
3、session会话关闭,临时节点自动清除。
4、自动创建顺序节点。

猜你喜欢

转载自blog.csdn.net/ytangdigl/article/details/108592772