前言
自己用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