1 Maven依赖
这里我是通过Curator来对ZooKeeper进行连接的,pom依赖如下所示:
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.13.0</version>
</dependency>
2 NodeCacheListener
NodeCacheListener是用来监听节点的新增、修改操作的。示例代码如下所示:
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class NodeCacheListenerTest {
/**
* ZooKeeper地址
*/
private static final String CONNECT_ADDR = "127.0.0.1:2181";
/**
* session超时时间
*/
private static final int SESSION_OUTTIME = 10000;
public static void main(String[] args) throws Exception {
//重试策略,初试时间为1s,重试10次
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 10);
//创建连接
CuratorFramework cf = CuratorFrameworkFactory.builder().connectString(CONNECT_ADDR).sessionTimeoutMs(SESSION_OUTTIME).retryPolicy(retryPolicy).build();
cf.start();
//创建一个cache缓存
NodeCache cache = new NodeCache(cf, "/super", false);
cache.start(true);
cache.getListenable().addListener(() -> {
if (cache.getCurrentData() != null) {
System.out.println("路径为:" + cache.getCurrentData().getPath());
System.out.println("数据为:" + new String(cache.getCurrentData().getData()));
System.out.println("状态为:" + cache.getCurrentData().getStat());
}
});
Thread.sleep(1000);
cf.create().forPath("/super", "123".getBytes());
Thread.sleep(1000);
cf.setData().forPath("/super", "456".getBytes());
Thread.sleep(1000);
cf.delete().forPath("/super");
Thread.sleep(Integer.MAX_VALUE);
cf.close();
}
}
3 PathChildrenCacheListener
PathChildrenCacheListener是用来监听子节点的新增、修改、删除操作。示例代码如下所示:
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class PathChildrenCacheListenerTest {
/**
* ZooKeeper地址
*/
private static final String CONNECT_ADDR = "127.0.0.1:2181";
/**
* session超时时间
*/
private static final int SESSION_OUTTIME = 10000;
public static void main(String[] args) throws Exception {
//重试策略,初试时间为1s,重试10次
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 10);
//创建连接
CuratorFramework cf = CuratorFrameworkFactory.builder().connectString(CONNECT_ADDR).sessionTimeoutMs(SESSION_OUTTIME).retryPolicy(retryPolicy).build();
cf.start();
//创建一个PathChildrenCache缓存,第三个参数为是否接受节点数据内容,如果为false则不接受
PathChildrenCache cache = new PathChildrenCache(cf, "/super", true);
cache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
cache.getListenable().addListener((curatorFramework, pathChildrenCacheEvent) -> {
switch (pathChildrenCacheEvent.getType()) {
case CHILD_ADDED:
System.out.println("CHILD_ADDED:" + pathChildrenCacheEvent.getData().getPath());
System.out.println("CHILD_ADDED:" + new String(pathChildrenCacheEvent.getData().getData()));
break;
case CHILD_UPDATED:
System.out.println("CHILD_UPDATED:" + pathChildrenCacheEvent.getData().getPath());
System.out.println("CHILD_UPDATED:" + new String(pathChildrenCacheEvent.getData().getData()));
break;
case CHILD_REMOVED:
System.out.println("CHILD_REMOVED:" + pathChildrenCacheEvent.getData().getPath());
System.out.println("CHILD_REMOVED:" + new String(pathChildrenCacheEvent.getData().getData()));
break;
default:
break;
}
});
//创建节点本身不会监听
cf.create().forPath("/super", "init".getBytes());
Thread.sleep(1000);
cf.create().forPath("/super/c1", "c1内容".getBytes());
Thread.sleep(1000);
cf.create().forPath("/super/c2", "c2内容".getBytes());
Thread.sleep(1000);
cf.setData().forPath("/super/c1", "c1更新内容".getBytes());
Thread.sleep(1000);
cf.delete().forPath("/super/c2");
Thread.sleep(1000);
//删除节点本身不会监听
cf.delete().deletingChildrenIfNeeded().forPath("/super");
Thread.sleep(Integer.MAX_VALUE);
cf.close();
}
}