ZooKeeper監聽功能實現

目錄

1 Maven依賴

2 NodeCacheListener

3 PathChildrenCacheListener


我使用的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();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章