除了主要功能,建模Curator还支持集成缓存,类型参数和版本控制。

缓存

ModeledFramework实例可以使用在内部使用Curator缓存的外观来封装。 所有读取操作都使用此缓存,而不是直接进行ZooKeeper调用。 您也可以监听节点更改。 例如:

ModeledFramework<MyModel> modeledClient = ModeledFramework.wrap(client, myModelSpec);
CachedModeledFramework<MyModel> cached = modeledClient.cached();
cached.start();

// reads come from the cache
cached.read().whenComplete(...) ...

cached.listenable.addListener((type, path, stat, model) -> {
    // type is NODE_ADDED, NODE_UPDATED, etc.
});

未解决的路径和缓存

如果ModelSpec路径中的最后一个节点是一个参数,CachedModeledFramework将自动侦听父路径。 例如:

ZPath path = ZPath.parseWithIds("/root/instance/{id}");
ModelSpec<MyModel> modelSpec = ModelSpec.builder(path, serializer);
ModeledFramework<MyModel> modeledClient = ModeledFramework.wrap(modelSpec, client, modelSpec);

CachedModeledFramework<MyModel> cached = modeledClient.cached();
cached.start(); // automatically listens to "/root/instance" and below

类型参数

ZPath等人的“解决”方法使用无类型对象。 理想情况下,我们应该能够以强类型的方式指定参数。 建模Curator的“类型”模板提供了这一点。 您可以为ZPaths,ModelSpecs和ModeledFramework指定类型参数。 Pub-Sub示例显示了如何使用ModeledFramework类型的参数。

类型化接口最多可提供10个参数,名为TypedZPath,TypedZPath2,TypedModelSpec,TypedModelSpec2,TypedModeledFramework,TypedModeledFramework2等。

以下是TypedModeledFramework的一个示例,它为Person创建一个模型,并使用两个参数来生成路径,即组和组织:

TypedModeledFramework2<Person, Group, Organization> clientTemplate = TypedModeledFramework2.from(
    ModeledFrameworkBuilder.build(),
    personModelSpec
);

...

Group group = ...
Organization organization = ...
ModeledFramework<Person> modeledClient = clientTemplate.resolve(asyncClient, group, organization);
client.set(person);

TypedZPath和TypedModelSpec类似地工作。

版本控制

Modeled Curator支持通过Versioned界面和VersionedModeledFramework API将ZNode版本与模型对象相关联。 要阅读模型及其ZNode版本,请使用:

ModeledFramework<Person> client = ...

client.versioned().read().whenComplete((value, e) -> {
    if ( value != null ) {
        // value's type is Versioned<Person>
        Person personModel = value.model();
        int znodeVersion = value.version();
    }
});

VersionedModeledFramework具有自动使用Versioned实例版本的set / update API。