zookeeper怎么用java创建临时节点

zookeeper怎么用java创建临时节点,第1张

基本 *** 作

下面给出基本的 *** 作 ZooKeeper 的示例代码,这样你就弯喊槐能对 ZooKeeper 有直观的认识了。下面的清单包括了创建与 ZooKeeper 服务器的连接以及最基本的数据 *** 作:

ZooKeeper 基本的 *** 作示例

// 创建一个与服务器的连接

ZooKeeper zk = new ZooKeeper("localhost:" + CLIENT_PORT,

ClientBase.CONNECTION_TIMEOUT, new Watcher() {

// 监控所有被触发的事件

public void process(WatchedEvent event) {

System.out.println("已经触发了" + event.getType() + "事件!")

}

})

// 创建一个目录节点

zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,

CreateMode.PERSISTENT)

// 创建一个子目录节点渗手

zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(),

Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT)

System.out.println(new String(zk.getData("/testRootPath",false,null)))

// 取出子目录节点列表

System.out.println(zk.getChildren("/testRootPath",true))

// 修改子目录节点数据

zk.setData("/testRootPath/testChildPathOne","modifyChildDataOne".getBytes(),-1)

System.out.println("目录节点状态:["+zk.exists("/testRootPath",true)+"]")

// 创建另外一个埋友子目录节点

zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(),

Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT)

System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo",true,null)))

// 删除子目录节点

zk.delete("/testRootPath/testChildPathTwo",-1)

zk.delete("/testRootPath/testChildPathOne",-1)

// 删除父目录节点

zk.delete("/testRootPath",-1)

// 关闭连接

zk.close()

输出的结果如下:

已经触发了 None 事件!

testRootData

[testChildPathOne]

目录节点状态:[5,5,,,0,1,0,0,12,1,6]

已经触发了 NodeChildrenChanged 事件!

testChildDataTwo

已经触发了 NodeDeleted 事件!

已经触发了 NodeDeleted 事件!

当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watcher 对象的 process 方法就会被调用。

ZooKeeper 节点是有生命周期的,这取决于节点的类型。在 ZooKeeper 中,节点类型可以分为持久节点(PERSISTENT )、临时节点(EPHEMERAL),以及时序节点(SEQUENTIAL ),具体在节点创建过程中,一般是组合使用,可以生成以下 4 种节点类型。

持久节点(PERSISTENT)

所谓持久节点,是指在节点创建后,就一直存在,直到有删除 *** 作来主动清除这个节点——不会因为创建该节点的客户端会话失效而消失。

持久顺序节点(PERSISTENT_SEQUENTIAL)

这类节点的基本特性和上面的节点类型是一致的。额外的特性是,在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。

临时节点(EPHEMERAL)

和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动裤档被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。

临时顺序节点(EPHEMERAL_SEQUENTIAL)

可以用来实现分布式锁

客户端调用create()方法创建名为“_locknode_/guid-lock-”的节亩纯敬点,需要注意的是,这里节点的创建类型需要设置为EPHEMERAL_SEQUENTIAL。

客户端调用getChildren(“_locknode_”)方法来获取所有已经创建的子节点,注意,这里不注册任何Watcher。

客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点序号最小,那么就认为这个客户端获得了锁。

如果在步骤3中发现自己并非所有子节点中最小的,说明自己还没有获取迅慎到锁。此时客户端需要找到比自己小的那个节点,然后对其调用exist()方法,同时注册事件监听。

之后当这个被关注的节点被移除了,客户端会收到相应的通知。这个时候客户端需要再次调用getChildren(“_locknode_”)方法来获取所有已经创建的子节点,确保自己确实是最小的节点了,然后进入步骤3。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11993299.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存