首先看PathChildrenCache.java
private volatile Watcher childrenWatcher = new Watcher()
{
@Override
public void process(WatchedEvent event)
{
offerOperation(new RefreshOperation(PathChildrenCache.this, RefreshMode.STANDARD));
}
};//每一次create节点会触发这个childrenWatcher,这个childrenWatcher加入在最外层节点上,同时应该会给子节点加上dataWatcber
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 )
{
offerOperation(new GetDataOperation(PathChildrenCache.this, event.getPath()));
}
}
catch ( Exception e )
{
handleException(e);
}
}
};//每一次数据改变或者删除这个节点。就是触发dataWatcher
当你create一个Node的时候,会将一个RefreshOperation操作提交给下面一个方法
private void offerOperation(final Operation operation)
{
if ( operationsQuantizer.add(operation) )
{
submitToExecutor
(
new Runnable()
{
@Override
public void run()
{
try
{
operationsQuantizer.remove(operation);
operation.invoke();
}
catch ( Exception e )
{
handleException(e);
}
}
}
);
}
}
接着这是一个命令模式,PathChildrenCache将CloseableExecutorService封装,submit方法交给CloseableExecutorService执行。CloseableExecutorService.java如下:
public Future<?> submit(Runnable task)
{
Preconditions.checkState(isOpen.get(), "CloseableExecutorService is closed");
InternalFutureTask<Void> futureTask = new InternalFutureTask<Void>(new FutureTask<Void>(task, null));
executorService.execute(futureTask);
return futureTask;
}
而CloseableExecutorService是对Executors$FinalizableDelegatedExecutorService的封装调用