2016-12-29 2 views
1

Я пытаюсь записать данные в ZooKeeper, используя транзакцию в библиотеке Apache Curator в Java.CuratorTransaction KeeperErrorCode = NoNode

Вот мой код:

private CuratorFramework client; 
... 
private void writeToZK() { 
    String nodePath = "/path/to/node"; 
    client.inTransaction().create().forPath(nodePath).and().commit(); // problem 
} 

(я использую куратор v2.9.0)

Это бросает:

org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode 
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:111) 
    at org.apache.zookeeper.ZooKeeper.multiInternal(ZooKeeper.java:949) 
    at org.apache.zookeeper.ZooKeeper.multi(ZooKeeper.java:915) 

Я порылся в ZooKeeper.multiInternal(), он получил реакция на зоб, содержащую

OpResult: err = -101, type = -1. 

Если я заменить строку «//» проблема с этим, он работает:

Любая идея?

+0

Если вы не используете транзакции, в DSL стандартного create() DS кулера есть опция createParentsIfNeeded(). – Randgalt

ответ

2

В zookeeper каждый узел определен с помощью пути. Пожалуйста, ознакомьтесь с документацией: https://zookeeper.apache.org/doc/trunk/zookeeperOver.html Они организованы как стандартная файловая система. Это означает, что вы не можете создать> «/ path/to/node», если «/ path/to» не существует. Решение, которое вы предлагаете, правильно, потому что, если родительский узел вашего узла не существует, он будет автоматически создан zookeeper.

+1

Получил это, так что в основном CuratorTransaction не обрабатывает родительские узлы изящно. Я создал родительский узел с отдельным create(), и это работает. Благодаря! – Jack

+1

Это не куратор, это проблема. Сам ZooKeeper этого не поддерживает. – Randgalt

Смежные вопросы