使用 curator 在 zookeeper 中创建一个 ttl 节点
Create a ttl node in zookeeper using curator
如何使用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();
结果:
节点没有被创建并且 flag
是 false
代码 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.call(CreateBuilderImpl.java:1131)
at org.apache.curator.framework.imps.CreateBuilderImpl.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时启用某些配置。
- 转到
conf
目录
- 创建一个名为
zoo.cfg
的新文件
- 将以下内容粘贴到文件中
tickTime=2000
dataDir=./data/zookeeper
clientPort=2181
maxClientCnxns=60
extendedTypesEnabled=true
emulate353TTLNodes=true
我的错误是我在配置文件中添加了 zookeeper.extendedTypesEnabled
。不要添加单词 zookeeper
。仅当您使用命令行 shell 即 zkCli.sh
.
时才需要它
现在使用 bin/zkServer.sh stop
和 bin/zkServer.sh start
重启集群。
以上命令可以正常工作,不会再抛出任何异常。
注意:如果 znode 未在 TTL 内修改并且没有子节点,它将在将来的某个时候成为被服务器删除的候选对象。
请记住,zookeeper 版本应 > 3.5.3
并且 java 客户端版本应与 zookeeper 版本相同
如何使用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();
结果:
节点没有被创建并且 flag
是 false
代码 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.call(CreateBuilderImpl.java:1131)
at org.apache.curator.framework.imps.CreateBuilderImpl.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时启用某些配置。
- 转到
conf
目录 - 创建一个名为
zoo.cfg
的新文件
- 将以下内容粘贴到文件中
tickTime=2000
dataDir=./data/zookeeper
clientPort=2181
maxClientCnxns=60
extendedTypesEnabled=true
emulate353TTLNodes=true
我的错误是我在配置文件中添加了 zookeeper.extendedTypesEnabled
。不要添加单词 zookeeper
。仅当您使用命令行 shell 即 zkCli.sh
.
现在使用 bin/zkServer.sh stop
和 bin/zkServer.sh start
重启集群。
以上命令可以正常工作,不会再抛出任何异常。
注意:如果 znode 未在 TTL 内修改并且没有子节点,它将在将来的某个时候成为被服务器删除的候选对象。
请记住,zookeeper 版本应 > 3.5.3
并且 java 客户端版本应与 zookeeper 版本相同