ZooKeeper-4.2 如何设置监视点- 高飞网

4.2 如何设置监视点

2018-05-31 14:45:15.0

    ZooKeeper的API中的所有读操作:getData、getChildren和exits,均可以选择在读取的znode节点上设置监视点,使用时,需要实现Watcher接口

abstract public void process(WatchedEvent event);

WatcherEvent的数据结构:

会话状态(KeeperState)

状态描述
Disconnected未连接状态
SyncConnected连接状态
AuthFailed认证失败
ConnectedReadOnly连接到只读服务端
SaslAuthenticated连接到SASL认证的服务端
Expired会话过期

事件类型(EventType)

事件描述其他
NodeCreated节点创建,通过exists方法设置数据监视点
NodeDeleted节点删除,通过exists或getData方法设置数据监视点
NodeDataChanged数据更新,通过exists或getData方法设置数据监视点
NodeChildrenChanged子节点变化,通过getChildren方法设置子节点监视点
Node无事件发生,只是会话状态变了,除此外都会返回一个节点path

注:监视点设置后,不能删除,只能通过触发监视点、或者会话过期或关闭才能取消。

测试代码示例:

public class WatchTest implements Watcher {

    ZKClient zkClient = ZKClient.instance();
    private final String TEST_PATH = "/testStatus";

    @Override
    public void process(WatchedEvent event) {
        System.out.println("event-" + event);
        //因为通知只有一次,因此获取通知后要再次设置监视点
        try {
            watch();
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据并设置监视点
     *
     * @return
     * @throws KeeperException
     * @throws InterruptedException
     */
    public void watch() throws KeeperException, InterruptedException {
        try {
            //这个可以发现节点的创建和删除,数据更新
            zkClient.exists(TEST_PATH, this);
            //这个可以发现节点的数据的变化,和节点删除
            zkClient.getData(TEST_PATH, this, null);
            //只有这个能发现子节点的变化
            zkClient.getChildren(TEST_PATH, this);
        } catch (KeeperException.NoNodeException e) {
            //捕获异常但不处理,以防止因异常程序退出
        }
    }

    public static void main(String[] args) throws KeeperException, InterruptedException {
        WatchTest watchTest = new WatchTest();
        watchTest.watch();
        Thread.sleep(600000);
    }
}