【问题标题】:Create a ttl node in zookeeper using curator使用curator在zookeeper中创建一个ttl节点
【发布时间】:2021-06-11 15:36:31
【问题描述】:

如何使用 apache curator 创建一个 ttl 节点?我已经尝试了以下

ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3);
        String connectionString = "127.0.0.1:2181";
        CuratorFramework client = CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
        client.getUnhandledErrorListenable().addListener((message, e) -> {
            System.err.println("error=" + message);
            e.printStackTrace();
        });
        client.getConnectionStateListenable().addListener((c, newState) -> {
            System.out.println("state=" + newState);
        });
        client.start();

代码 1:

PersistentTtlNode persistentTtlNode = new PersistentTtlNode(client, "/stores/abc.com", 10000, "".getBytes());
        persistentTtlNode.start();
        boolean flag = persistentTtlNode.waitForInitialCreate(1000, TimeUnit.MICROSECONDS);
        System.out.println(flag);
        persistentTtlNode.close();

结果: 未创建节点,flagfalse

代码 2:

client.create().withTtl(1000).creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT_WITH_TTL).forPath("/stores/india.com");

结果: 得到以下异常:

Exception in thread "main" org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /stores/india.com
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:106)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
    at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:1837)
    at org.apache.curator.framework.imps.CreateBuilderImpl$16.call(CreateBuilderImpl.java:1131)
    at org.apache.curator.framework.imps.CreateBuilderImpl$16.call(CreateBuilderImpl.java:1113)
    at org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:93)
    at org.apache.curator.framework.imps.CreateBuilderImpl.pathInForeground(CreateBuilderImpl.java:1110)
    at org.apache.curator.framework.imps.CreateBuilderImpl.protectedPathInForeground(CreateBuilderImpl.java:593)
    at org.apache.curator.framework.imps.CreateBuilderImpl.forPath(CreateBuilderImpl.java:583)
    at org.apache.curator.framework.imps.CreateBuilderImpl.forPath(CreateBuilderImpl.java:561)
    at org.apache.curator.framework.imps.CreateBuilderImpl.forPath(CreateBuilderImpl.java:48)
    at Main.main(Main.java:67)

在apache curator中用ttl创建节点的正确方法是什么?

【问题讨论】:

    标签: java apache-zookeeper apache-curator


    【解决方案1】:

    终于找到答案了,显然我们需要在启动zookeeper的时候启用某些配置。

    1. 转到conf目录
    2. 创建一个名为zoo.cfg 的新文件
    3. 将以下内容粘贴到文件中
    tickTime=2000
    dataDir=./data/zookeeper
    clientPort=2181
    maxClientCnxns=60
    extendedTypesEnabled=true
    emulate353TTLNodes=true
    

    我的错误是我在配置文件中添加了zookeeper.extendedTypesEnabled。不要添加单词zookeeper。仅当您使用命令行 shell 时才需要它,即 zkCli.sh

    现在使用bin/zkServer.sh stopbin/zkServer.sh start 重新启动集群。

    上面的命令可以正常工作,不会再抛出任何异常。

    注意:如果 znode 在 TTL 内没有修改并且没有子节点,它将成为将来某个时候被服务器删除的候选节点。

    记住,zookeeper版本应该是>3.5.3,java客户端版本应该和zookeeper版本一样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 2016-06-16
      • 1970-01-01
      相关资源
      最近更新 更多