目錄
我使用的ZooKeeper的版本是3.4.14,虛擬機的ip是192.168.253.129。
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();
}
}