使用 curator 在 zookeeper 中创建一个 ttl 节点

问题描述

如何使用 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 创建节点的正确方法是什么?

解决方法

终于找到答案了,显然我们需要在启动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版本一样

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...