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();
}
}