curator PathChildrenCache start() 监听源码分析

本文详细分析了Curator中的PathChildrenCache的启动过程,特别是`start()`方法及其内部的`rebuild()`和`refresh()`操作。通过`submitToExecutor()`提交任务到线程池,`operation.invoke()`执行`RefreshOperation`,从而触发监听器的事件处理,实现对Zookeeper节点子数据的实时监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

自己用zookeeper原生api 不晓得怎么实现永久监听就来看Curator监听的源码了。
最开始看了个半懂,后面还是参考了 别人的
参考网址:Curator应用场景(二)-Watch监听机制(NodeCache,PathChildrenCache,TreeCache)

PathChildrenCache成员变量

//客户端
 private final WatcherRemoveCuratorFramework client;
 	//监听路径
    private final String path;
    //线程池
    private final CloseableExecutorService executorService;
    //是否缓存节点数据
    private final boolean cacheData;
    //数据是否压缩
    private final boolean dataIsCompressed;
    //监听器集合  自己写的监听会加到这里。然后被offerOperation方法invoke调用执行
    private final ListenerContainer<PathChildrenCacheListener> listeners = new ListenerContainer<PathChildrenCacheListener>();
    //当前节点数据集合
    private final ConcurrentMap<String, ChildData> currentData = Maps.newConcurrentMap();
    //没太懂这个是啥   原子性的初始化的子节点数据?
    private final AtomicReference<Map<String, ChildData>> initialSet = new AtomicReference<Map<String, ChildData>>();
    //操作器  这个在offerOperation的时候加一下,线程执行的时候又remove
    private final Set<Operation> operationsQuantizer = Sets.newSetFromMap(Maps.<Operation, Boolean>newConcurrentMap());
    //节点状态  LATENT潜在的
    private final AtomicReference<State> state = new AtomicReference<State>(State.LATENT);
    //确认路径的容器...  就是路径确认的一个封装  我是这么理解的
    private final EnsureContainers ensureContainers;
	//给PathChildrenCache初始化的时候用的
    public static final ThreadFactory defaultThreadFactory = ThreadUtils.newThreadFactory("PathChildrenCache");
	
	//子节点监视器  就是套娃从而永久监听也可以说的递归?
    private volatile Watcher childrenWatcher = new Watcher()
    {
   
        @Override
        public void process(WatchedEvent event)
        {
   
            offerOperation(new RefreshOperation(PathChildrenCache.this, RefreshMode.STANDARD));
        }
    };

	//连接监听器 
    private volatile ConnectionStateListener connectionStateListener = new ConnectionStateListener()
    {
   
        @Override
        public void stateChanged(CuratorFramework client, ConnectionState newState)
        {
   
            handleStateChange(newState);
        }
    };

//数据监听器
private volatile Watcher dataWatcher = new Watcher()
    {
   
        @Override
        public void process(WatchedEvent event)
        {
   
            try
            {
   
                if ( event.getType() == Event.EventType.NodeDeleted )
                {
   
                    remove(event.getPath());
                }
                else if ( event.getType() == Event.EventType.NodeDataChanged 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值