zookeeper

435 阅读1分钟

zookeeper javaAPI

maven 依赖 (zookeeper:3.5.5 对应 curator: 4.x)

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>2.0.0-alpha1</version>
            <scope>test</scope>
        </dependency>

javaAPI

class Demo {

    private val services = "localhost:2181,localhost:2182,localhost:2183"

    /**
     * 创建与获取节点
     */
    @Test
    fun createNode() {
//        重试策略 : 最大重试次数3, 每次重试间隔1000ms
        val exponentialBackoffRetry = ExponentialBackoffRetry(1000, 3)
//        创建客户端: 会话超时时间 8000ms, 连接超时时间: 8000ms
        val client = CuratorFrameworkFactory.newClient(services, 8000, 8000, exponentialBackoffRetry)
//        启动客户端
        client.start()
//      在/a/b下创建一个永久序列节点c,设置值为world,若父节点不存在, 则创建父节点
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/a/b/c", "ccc".toByteArray())
//      在/a/b下创建一个零时节点hello,设置值为world,若父节点不存在, 则创建父节点
        client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/a/b/hello", "world".toByteArray())
//        获取数据
        println(client.data.forPath("/a/b/hello").toString(StandardCharsets.UTF_8))
//      关闭客户端    (临时节点将会删除)
        client.close();
    }

    /**
     * watch
     */
    @Test
    fun watch() {
//        重试策略 : 最大重试次数3, 每次重试间隔1000ms
        val exponentialBackoffRetry = ExponentialBackoffRetry(1000, 3)
//        创建客户端: 会话超时时间 8000ms, 连接超时时间: 8000ms
        val client = CuratorFrameworkFactory.newClient(services, 8000, 8000, exponentialBackoffRetry)
//        启动客户端
        client.start()
//        绑定监听节点  (可以监听不存在的节点)
        val treeCache = TreeCache(client, "/watch").apply {
            listenable.addListener(TreeCacheListener { curatorFramework, treeCacheEvent ->
//              初始化时,数据为空  TreeCacheEvent{type=INITIALIZED, data=null}
                if (treeCacheEvent.data == null) return@TreeCacheListener
                println(treeCacheEvent)
            })
        }.also { it.start() }

//        创建
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/watch", "ccc".toByteArray())
//        创建子节点
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/watch/a", "aaa".toByteArray())
//        修改
        client.setData().forPath("/watch", "cc".toByteArray())
//        修改子节点
        client.setData().forPath("/watch/a", "aa".toByteArray())
//        删除子节点
        client.delete().forPath("/watch/a")
//        删除 (子节点为空才能删除父节点)
        client.delete().forPath("/watch")
        Thread.sleep(3000)
        client.close();

    }

}