Zookeeper 使用TreeCache 做监听器的实践

943 阅读1分钟

虽然现在TreeCache已经是处于deprecated的阶段,但是对于旧版本的zookeeper集群,依然需要TreeCache做监听器来完成。这里基于Sprig-Boot来给展示一个比较典型的TreeCache用法。

package com.juejin.util;

import lombok.SneakyThrows;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.junit.Test;

import java.util.concurrent.TimeUnit;

/**
 * @program: 
 * @description: 
 * @author: 
 * @create: 2020-12-02 15:31
 **/
public class TestWatcher {
    @Test
    @SneakyThrows
    public void test() {
        CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
                .connectString("localhost:2181")
                .namespace("sigward_test")
                .retryPolicy(new ExponentialBackoffRetry(1000, 3));
        CuratorFramework client = builder.build();
        client.start();
        client.blockUntilConnected();
        System.out.println("connected");

        TreeCache watcher = new TreeCache(client, "/");
        watcher.getListenable().addListener(new TreeCacheListener() {
            @Override
            public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
                System.out.println(event);
            }
        });
        watcher.start();
        System.out.println("watched");

        TimeUnit.SECONDS.sleep(5);

        System.out.println(watcher.getCurrentChildren("/"));
        System.out.println(watcher.getCurrentChildren("/").keySet());

        while (true) {
            System.out.println(new String(watcher.getCurrentData("/").getData()));
            // 这时间里可以set一下kafka node,看看有没有同步过来
            TimeUnit.SECONDS.sleep(5);
        }
    }
}