#apache-zookeeper #apache-curator
#apache-zookeeper #apache-куратор
Вопрос:
Я использую CachedModeledFramework куратора Apache, чтобы попытаться кэшировать все дочерние узлы в пути. Я хочу получать уведомления при загрузке кэша. Если дочерние элементы существуют, я получаю события NODE_ADDED от прослушивателя, но я не могу найти способ получать уведомления, когда они полностью кэшируются, даже если дочерних элементов еще не существует. Я не могу использовать readThrough или readThroughAsZNode, потому что ZPath не разрешен.
Кроме того, modeledClient.cached()
строка выдает предупреждение «CuratorCache не поддерживает пользовательский ExecutorService», даже если я не передаю исполнителя (такое же предупреждение появляется, если я передаю исполнителя).
private static final ModelSpec<Monitor> monitorSpec = ModelSpec.builder(ZPath.parseWithIds("/monitors/{id}"), JacksonModelSerializer.build(Monitor.class)).build();
private CachedModeledFramework<Monitor> cached;
public void init() {
AsyncCuratorFramework async = AsyncCuratorFramework.wrap(CuratorMgr.getClient());
ModeledFramework<Monitor> modeledClient = ModeledFramework.wrap(async, monitorSpec);
cached = modeledClient.cached();
cached.start();
cached.listenable().addListener((type, path, stat, model) -> {
logger.info("LISTENER {} {}", type, path);
});
}
Редактировать
Я нашел ответ. У ModeledCacheListener есть инициализированный метод, который я могу переопределить.
cached.listenable().addListener(new ModeledCacheListener<Monitor>() {
@Override
public void accept(ModeledCacheListener.Type type, ZPath path, Stat stat, Monitor model) {
logger.info("LISTENER {} {}", type, path);
}
@Override
public void initialized() {
ModeledCacheListener.super.initialized();
logger.info("INITIALIZED");
}
});
Ответ №1:
Отредактировал начальный пост с ответом о переопределении инициализированного метода ModeledCacheListener