在Curator中,可以通过以下API来更新指定节点的数据。
Curator更新数据API
- CuratorFramework
- public SetDataBuilder setData();
- Versionable<T>
- public T withVersion(int version);
- public T withVersion(int version);
- PathANdBytesable<T>
- public T forPath(String path,byte[] data) throws Exception;
- public T forPath(String path) throws Exception;
以上就是一系列最常用的更新数据API,下面通过一些具体场景来说明如何使用这些API。
更新一个节点的数据内容
client.setData().forPath(path);
调用该接口后,会返回一个stat对象。
更新一个节点的数据内容,强制指定版本进行更新
client.setData().withVersion(version).forPath(path);
注意,withVersion接口就是用来实现CAS(Compare and Swap)的,version(版本信息)通常是从一个旧的stat对象中获取到的。
下面通过一个实际例子来看看如何在代码中使用这些API。
// 使用Curator更新数据内容
public class Set_Data_Sample {
static String path = "/zk-book";
static CuratorFramework client = CuratorFrameworkFactory.builder().connectString("domain1.book.zookeeper:2181").sessionTimeoutMs(5000).retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();
public static void main(String[] args) throws Exception {
client.start();
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path, "init".getBytes());
Stat stat = new Stat();
client.getData().storingStatIn(stat).forPath(path);
System.out.println("Success set node for : " + path + ", new version: " + client.setData().withVersion(stat.getVersion()).forPath(path).getVersion());
try {
client.setData().withVersion(stat.getVersion()).forPath(path);
} catch (Exception e) {
System.out.println("Fail set node due to " + e.getMessage());
}
}
}
运行程序,输出结果如下:
上面的示例程序演示了如何使用Curator的API来进行ZooKeeper数据节点的内容更新。该程序前后进行了两次更新操作,第一次使用最新的stat变量进行更新操作,更新成功;第二次使用了过期的stat变量进行更新操作,抛出异常:KeeperErrorCode = BadVersion。