curator 监听数据节点子节点的变化情况

文章目录

PathChildrenCache

  • NodeCache不仅可以监听节点内容变化,还可以监听指定节点是否存在。如果原本节点不存在,那么Cache就会在节点被创建时触发监听事件,如果该节点被删除,就无法再触发监听事件。
  • PathChildrenCache用于监听数据节点子节点的变化情况。
  • curator之事件监听详解

API

package com.ruozedata.bigdata.zookeeper;


import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;

public class PathChildrenListener {



    private static Logger logger = LoggerFactory.getLogger(PathChildrenListener.class);
    private static CountDownLatch watch = new CountDownLatch(1);
    private static final String zkServerIps = "ruozedata000:2181";  //可以写多个地址,逗号分隔
    private static RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
    // 实例化Curator客户端
    private static CuratorFramework client = CuratorFrameworkFactory.builder()                  // 使用工厂类来建造客户端的实例对象
            .connectString(zkServerIps)                         // 放入zookeeper服务器ip
            .sessionTimeoutMs(15000).retryPolicy(retryPolicy)   // 设定会话时间以及重连策略
            .build();                                           // 建立连接通道

    /**
     * 注册监听
     * TreeCache: 可以将指定的路径节点作为根节点(祖先节点),对其所有的子节点操作进行监听,
     * 呈现树形目录的监听,可以设置监听深度,最大监听深度为 int 类型的最大值。
     */
    private static void zkWatch(String path) throws Exception {
        TreeCache treeCache = new TreeCache(client, path);

        treeCache.getListenable().addListener(new TreeCacheListener() {
            @Override
            public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
                ChildData eventData = event.getData();
                switch (event.getType()) {
                    case NODE_ADDED:
                        logger.warn(path + "节点添加" + eventData.getPath() + "\t添加数据为:" + new String(eventData.getData()));
                        break;
                    case NODE_UPDATED:
                        logger.warn(eventData.getPath() + "节点数据更新\t更新数据为:" + new String(eventData.getData()) + "\t版本为:" + eventData.getStat().getVersion());
                        break;
                    case NODE_REMOVED:
                        logger.warn(eventData.getPath() + "节点被删除");
                        break;
                    default:
                        break;
                }
            }
        });

        treeCache.start();
        watch.await();  //如果不执行 watch.countDown(),进程会一致阻塞在 watch.await()
    }

    // 获取节点数据
    private static void getZnode(String path) throws Exception {

        byte[] bytes = client.getData().forPath(path);                     // 普通查询
        System.out.println(new String(bytes));
    }

    // 关闭连接
    private static void closeZnode() {
        if (client != null) {
            client.close();
        }
    }


    public static void main(String[] args) throws Exception {
        client.start();         // 启动Curator客户端
        System.out.println(client.getState());    //获取连接状态
        String path = "/ruoze";
        getZnode(path);		   // 获取节点数据
        zkWatch(path);          // 监听这个节点
        closeZnode();           // 关闭Curator客户端
    }

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值