2016-12-29 3 views
1

Java의 Apache 큐레이터 라이브러리에서 트랜잭션을 사용하여 ZooKeeper에 데이터를 쓰려고합니다. 큐레이터 트랜잭션 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

트랜잭션을 사용하지 않는 경우 큐레이터의 표준 create() DSL에는 creatingParentsIfNeeded() 옵션이 있습니다. – Randgalt

답변

2

사육사에서 모든 노드는 경로로 정의됩니다. 문서를 살펴보십시오. https://zookeeper.apache.org/doc/trunk/zookeeperOver.html 표준 파일 시스템처럼 구성되어 있습니다. "/ path/to"가없는 경우> "/ path/to/node"를 만들 수 없다는 뜻입니다. 노드의 부모가 존재하지 않으면 사육사가 자동으로 생성하기 때문에 제안한 해결책은 정확합니다.

+1

기본적으로 CuratorTransaction은 부모 노드를 우아하게 처리하지 않습니다. 별도의 create()를 사용하여 부모 노드를 만들고 그 노드가 작동합니다. 감사! – Jack

+1

그것은 큐레이터가 아니에요. ZooKeeper 자체는 이것을 지원하지 않습니다. – Randgalt