import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.framework.recipes.cache.NodeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;

/**
 * 
 * @ClassName: NodeCache_Sample
 * @Description: TODO(节点监听)
 * @author RongShu
 * @date 2017年6月17日 下午1:23:18
 *
 */
public class NodeCache_Sample {

	static String path = "/zk-book/nodecache";
	static CuratorFramework client = CuratorFrameworkFactory.builder().connectString("localhost:2181")
			.sessionTimeoutMs(5000).retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();

	public static void main(String[] args) throws Exception {
		client.start();
		client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path, "init".getBytes());
		final NodeCache cache = new NodeCache(client, path, false);
		cache.start(true);
		cache.getListenable().addListener(new NodeCacheListener() {
			public void nodeChanged() throws Exception {
				System.out.println("Node data update, new data: " + new String(cache.getCurrentData().getData()));
			}
		});
		client.setData().forPath(path, "u".getBytes());
		Thread.sleep(1000);
		client.delete().deletingChildrenIfNeeded().forPath(path);
		Thread.sleep(Integer.MAX_VALUE);
	}
}
输出
Node data update, new data: u


注意:

NodeCache的start方法传递一个boolean类型参数,默认false,如果设置为true,那么NodeCache在第一次启动打的时候就会立刻在Zookeeper上读取对应节点的数据内容,并保存在Cache中。

NodeCache不仅可以用于监听数据节点内容变更,也能监听指定节点是否存在。如果原本节点不存在,那么cache就会在节点创建后触发NodeCacheListener,但是如果该节点被删除,那么Curator就无法触发NodeCacheListener了。


扩展:



参考

1.《从Paxos到Zookeeper:分布式一致性原理与实践》

2.https://zookeeper.apache.org/doc/r3.5.3-beta/javaExample.html



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐