使用Curator也可以简化Ephemeral Node (临时节点)的操作。临时节点驻存在ZooKeeper中,当连接和session断掉时被删除。比如通过ZooKeeper发布服务,服务启动时将自己的信息注册为临时节点,当服务断掉时ZooKeeper将此临时节点删除,这样client就不会得到服务的信息了。

1.PersistentEphemeralNode类

    PersistentEphemeralNode类代表临时节点。其构造函数如下:
  1. /**
  2. * @param client client instance
  3. * @param mode creation/protection mode
  4. * @param basePath the base path for the node
  5. * @param data data for the node
  6. */
  7. public PersistentEphemeralNode(CuratorFramework client, Mode mode, String basePath, byte[] initData)
其它参数还好理解,不好理解的是PersistentEphemeralNode.Mode:
  • EPHEMERAL: 以ZooKeeper的 CreateMode.EPHEMERAL方式创建节点。
  • EPHEMERAL_SEQUENTIAL: 如果path已经存在,以CreateMode.EPHEMERAL创建节点,否则以CreateMode.EPHEMERAL_SEQUENTIAL方式创建节点。
  • PROTECTED_EPHEMERAL: 以CreateMode.EPHEMERAL创建,提供保护方式。
  • PROTECTED_EPHEMERAL_SEQUENTIAL: 类似EPHEMERAL_SEQUENTIAL,提供保护方式。
    保护方式是指一种很边缘的情况:当服务器将节点创建好,但是节点名还没有返回给client,这时候服务器可能崩溃了,然后此时ZK session仍然合法,所以此临时节点不会被删除。对于client来说,它无法知道哪个节点是它们创建的。
    即使不是sequential-ephemeral,也可能服务器创建成功但是客户端由于某些原因不知道创建的节点。
    Curator对这些可能无人看管的节点提供了保护机制。 这些节点创建时会加上一个GUID。 如果节点创建失败正常的重试机制会发生。 重试时, 首先搜索父path, 根据GUID搜索节点,如果找到这样的节点, 则认为这些节点是第一次尝试创建时创建成功但丢失的节点,然后返回给调用者。
注意:节点必须调用start方法启动。 不用时调用close方法。PersistentEphemeralNode 内部自己处理错误状态。

2.编写示例程序

    我们的例子创建了两个节点,一个是临时节点,一个事持久化的节点。可以看到,client重连后临时节点不存在了。
  1. public class PersistentEphemeralNodeExample
  2. {
  3. private static final String PATH = "/example/ephemeralNode";
  4. private static final String PATH2 = "/example/node";
  5. public static void main(String[] args) throws Exception
  6. {
  7. CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));
  8. client.getConnectionStateListenable().addListener(new ConnectionStateListener()
  9. {
  10. @Override
  11. public void stateChanged(CuratorFramework client, ConnectionState newState)
  12. {
  13. System.out.println("连接状态:" + newState.name());
  14. }
  15. });
  16. client.start();
  17. PersistentEphemeralNode node = new PersistentEphemeralNode(client, Mode.EPHEMERAL, PATH, "临时节点".getBytes());
  18. node.start();
  19. node.waitForInitialCreate(3, TimeUnit.SECONDS);
  20. String actualPath = node.getActualPath();
  21. System.out.println("临时节点路径:" + actualPath + " | 值: " + new String(client.getData().forPath(actualPath)));
  22. client.create().forPath(PATH2, "持久化节点".getBytes());
  23. System.out.println("持久化节点路径: " + PATH2 + " | 值: " + new String(client.getData().forPath(PATH2)));
  24. KillSession.kill(client.getZookeeperClient().getZooKeeper(), "127.0.0.1:2181");
  25. System.out.println("临时节点路径:" + actualPath + " | 是否存在: " + (client.checkExists().forPath(actualPath) != null));
  26. System.out.println("持久化节点路径: " + PATH2 + " | 值: " + new String(client.getData().forPath(PATH2)));
  27. CloseableUtils.closeQuietly(node);
  28. CloseableUtils.closeQuietly(client);
  29. }
  30. }

3.示例程序运行结果

    运行结果控制台:
  1. 连接状态:CONNECTED
  2. 临时节点路径:/example/ephemeralNode | 值: 临时节点
  3. 持久化节点路径: /example/node | 值: 持久化节点
  4. 连接状态:SUSPENDED
  5. 连接状态:LOST
  6. 连接状态:RECONNECTED
  7. 临时节点路径:/example/ephemeralNode | 是否存在: true
  8. 持久化节点路径: /example/node | 值: 持久化节点

-------------------------------------------------------------------------------------------------------------------------------

09.Curator临时节点的更多相关文章

  1. Zookeeper--0300--java操作Zookeeper,临时节点实现分布式锁原理

    删除Zookeeper的java客户端有  : 1,Zookeeper官方提供的原生API, 2,zkClient,在原生api上进行扩展的开源java客户端 3, 一.Zookeeper原生API ...

  2. Zookeeper的临时节点和永久节点

    Zookeeper中节点分为两种:临时节点和永久节点. 临时节点有一个节点: 当创建临时节点的程序停掉之后,这个临时节点就会消失. 更直观的,如下   Persistent是临时节点. Persist ...

  3. 实验:zk master宕机后,临时节点在新的master上是否存在,结果出人意料

    一.实验 实验说明:3台zk集群,主要验证:master上的客户端,在master上建立临时节点,当master宕机时,其他follower选为主后,临时节点是否存在. 主要是通过此来验证,基于zk的 ...

  4. mysql 创建临时节点

    use ZooKeeper; use AnyEvent; use AE; use Data::Dumper; use IO::Socket; my $zk = ZooKeeper->new(ho ...

  5. 临时节点不能有child 子节点

    [zk: 127.0.0.1:2181(CONNECTED) 67] create '/zk01/0001/aaaa' dada Ephemerals cannot have children: /z ...

  6. zookeeper客户端使用第三方(Curator)封装的Api操作节点

    1.为什么使用Curator? Curator本身是Netflix公司开源的zookeeper客户端: Curator  提供了各种应用场景的实现封装: curator-framework  提供了f ...

  7. 基于zk“临时顺序节点“的分布式锁

    import org.apache.zookeeper.*; import org.apache.zookeeper.data.Stat; import java.io.IOException; im ...

  8. Zookeeper注册节点的掉线自动重新注册及测试方法

    转载:http://www.codelast.com/ 在一套分布式的online services系统中,各service通常不会放在一台服务器上,而是通过Zookeeper这样的东西,将自己的se ...

  9. Curator实现分布式锁

    分布式锁的应用 分布式锁服务宕机, ZooKeeper 一般是以集群部署, 如果出现 ZooKeeper 宕机, 那么只要当前正常的服务器超过集群的半数, 依然可以正常提供服务 持有锁资源服务器宕机, ...

随机推荐

  1. 【转载】ASP.NET Core 中间件详解及项目实战

    前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章 ...

  2. OpenCV_基于局部自适应阈值的图像二值化

    在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...

  3. KEGG orthology (KO) 数据库简介

    KEGG, 简称京都基因组百科全书,包含了许多的数据库,对于研究基因功能来说,KEGG orthology 数据库是最基本的一个数据库: KEGG Orthology 简称KO, 对于每个功能已知的基 ...

  4. Android SwipeMenuListView

     Android平台上的第三方开源项目SwipeMenuListView是一种能够在某一个view条目中响应用户左右側滑(从左向右,或从右向左滑动),滑出操作菜单的UI控件.类似这样的控件达到的U ...

  5. ReSharper插件功能介绍

    ReSharper是一款功能非常强悍的Visual Studio的辅助插件,这款插件可用于C#,VB.net,XML,Asp.net,XAML,和构建脚本.ReSharper 9.1版本大改进对 Ja ...

  6. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(1)

    在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只 ...

  7. Visual Studio使用技巧,创建自己的代码片段

    1.代码片段的使用示例 在编写代码中常会使用代码片段来提高我们的编写代码的效率,如:在Visual Studio中编写一个 for(int i = 0; i < length;i++) { } ...

  8. Redis生成Id主键的工具

    public class PrimaryKeyGenerator { private static readonly NedisClient client = new NedisClient(GetR ...

  9. listView解决滑动时黑色背景问题

    listView.setCacheColorHint(Color.TRANSPARENT);//解决滑动时黑色背景问题 listView滑动时黑色背景问题 原因在于ListView存在缓存颜色机制,因 ...

  10. java.util.logging.Logger使用具体解释

    java.util.logging.Logger不是什么新奇东西了,1.4就有了,但是由于log4j的存在,这个logger一直沉默着,事实上在一些測试性的代码中,jdk自带的logger比log4j ...