zoukankan      html  css  js  c++  java
  • Zookeeper系列2 原生API 以及核心特性watcher

    原生API 增删改查询

    public class ZkBaseTest {
    	static final String CONNECT_ADDR = "192.168.0.120";
    	static final CountDownLatch countDownLatch = new CountDownLatch(1);
    
    	public static void main(String[] args) throws Exception {
    
    		// 获取zookeeper对象
    		ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, 20000, new Watcher() {
    
    			@Override
    			public void process(WatchedEvent event) {
    				KeeperState state = event.getState();
    				EventType type = event.getType();
    				if (KeeperState.SyncConnected == state) {
    					if (EventType.None == type) {
    
    						countDownLatch.countDown();
    					}
    				}
    
    			}
    
    		});
    		countDownLatch.await(); // 一直阻塞直到链接成功
    
    		zk.create("/test", "testdata".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    
    		byte[] data = zk.getData("/test", false, null);
    		System.out.println("data " + new String(data));
    		
    		zk.setData("/test", "newdata".getBytes(), -1);
    		byte[] afterData = zk.getData("/test", false, null);
    		System.out.println("afterData " + new String(afterData));
    		
    		zk.delete("/test", -1); //删除过程中,需要版本检查 -1表示跳过版本检查
    		zk.close();
    	}
    
    }
    

      

    注意:节点类型分为四种 临时,临时顺序 持久 持久顺序

    临时节点的有效期 是当次连接开始到当次连接结束。

    实际开发中,我们一般不会使用原生APi去开发,超级不好用。一般会使用

    Curator或者zkclient 后面都会介绍到

    Watcher 

    之前提到,监控机制是zookeeper的一个核心特性。是一次性触发的。

    watch监控的数据或者节点发生变化,会通知设置了该监控的client

    watcherZookeeperwatch是一次性的!!!监听一次就失效

    有一下两类事件(节点相关的)以及连接zookeeper相关的状态

    我们主要重点关注节点相关

    可以设置观察的操作:exists,getChildren,getData

    可以触发观察的操作:create,delete,setData

    znode以某种方式发生变化时,“观察”(watch)机制可以让客户端得到通知.可以针对ZooKeeper服务的“操作”来设置观察,该服务的其他 操作可以触发观察.

    这里需要需要注意的是exists可以监控不存在的节点,当创建了该节点以后,则这个观察会被触发,之前的那个客户端就会得到通知.getChildren,getData不可以

    另外exists(path,true)监控的就是该path节点创建 删除 修改

    getChildren(path,watcher)监控的就是该path节点下的子节点的变化(子节点的创建、修改、删除都会监控到)这里有一点不是很友好,他们对应的事件都是一个 。我们需要自己来判断

     这里可以用过保存上次getChildren获得的值 ,两个通过比较就知道具体是什么变化的了。

    最后注意 :监控只是一次性的,如果要一直监控,需要多次设置。

  • 相关阅读:
    svn上传文件钩子
    linux服务器版svn安装
    csp-s模拟55
    csp-s模拟54
    csp-s模拟53
    csp-s模拟52
    csp-s模拟51
    csp-s模拟50
    csp-s模拟49
    csp-s模拟48
  • 原文地址:https://www.cnblogs.com/javabigdata/p/7501947.html
Copyright © 2011-2022 走看看