私はDocker化されたzookeeperインスタンスでApache Curatorを使おうとしていますが、どのように接続しようとしても、常に
org.Apache.zookeeper.KeeperException $ UnimplementedException:KeeperErrorCode = Unimplemented for ...
エラー。ドキュメントを理解しようとしましたが、どこにも行きません。 Zookeeper CLIにログインして、ポート番号が正しいことを確認しました。
snerd@powerglove:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 31f1093495ba compose_zookeeper "/opt/zookeeper/bin/ 3 weeks ago Up About a minute 0.0.0.0:32770->2181/tcp,
0.0.0.0:32769->2888/tcp, 0.0.0.0:32768->3888/tcp zookeeper
これが私が使用しようとしているコードです:
public class App {
public static void main( String[] args ) {
CuratorFramework client = CuratorFrameworkFactory.newClient("0.0.0.0:32770", new RetryUntilElapsed(3000, 1000));
client.start();
try {
client.create().forPath("/larry-smells/foop", "tuna?".getBytes());
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
Curator入門ページ からわかる限り、これはうまくいくはずです。何が欠けていますか?
edit1これで、飼育係の集団からデータを引き出すことができることがわかりました。
System.out.println(new String(curatorFramework.getData().forPath("/larry-smells")));
しかし、作成コマンドはまだ爆発しています。
edit2
エラーのスタックトレース:
org.Apache.zookeeper.KeeperException.create(KeeperException。org.Apache.zookeeper.KeeperException.create(KeeperException.Java:103)で/ larry-smells/foopのorg.Apache.zookeeper.KeeperException $ UnimplementedException:Unimplemented Java:51)org.Apache.zookeeper.ZooKeeper.create(ZooKeeper.Java:1297)at org.Apache.curator.framework.imps.CreateBuilderImpl $ 17.call(CreateBuilderImpl.Java:1040)at org.Apache.curator。 framework.imps.CreateBuilderImpl $ 17.call(CreateBuilderImpl.Java:1023)at org.Apache.curator.connection.StandardConnectionHandlingPolicy.callWithRetry(StandardConnectionHandlingPolicy.Java:67)at org.Apache.curator.RetryLoop.callWithRetry(RetryLoop.Java:99 )org.Apache.curator.framework.imps.CreateBuilderImpl.pathInForeground(CreateBuilderImpl.Java:1020)at org.Apache.curator.framework.imps.CreateBuilderImpl.protectedPathInForeground(CreateBuilderImpl.Java:501)at org.Apache.curator。フレームワーク.imps.CreateBuilderImpl.forPath(CreateBuilderImpl.Java:491)atまたはg.Apache.curator.framework.imps.CreateBuilderImpl $ 4.forPath(CreateBuilderImpl.Java:367)at org.Apache.curator.framework.imps.CreateBuilderImpl $ 4.forPath(CreateBuilderImpl.Java:309)at com.mycompany.app。 App.main(App.Java:35)
編集:どうやらこのエラーは、Zookeeperと組み合わせてCuratorの間違った組み合わせを使用している場合に発生する可能性があります。 curator.Apache.org から:
Curator 2.x.x-ZooKeeper 3.4.xとZooKeeper 3.5.xの両方と互換性があります
Curator 3.x.x-ZooKeeper 3.5.xとのみ互換性があり、動的再構成などの新機能のサポートが含まれています。
スタックトレースではなく、エラーコードだけで問題を特定することは困難ですが、アプリケーションをより安定させるために私が提案するいくつかの改善点は次のとおりです。
public class App {
public static void main( String[] args ) {
CuratorFramework client = CuratorFrameworkFactory.newClient("0.0.0.0:32770", new RetryUntilElapsed(3000, 1000));
client.start();
try {
//make sure you're connected to zookeeper.
client.blockUntilConnected();
//Make sure the parents are created.
client.create().creatingParentsIfNeeded().forPath("/larry-smells/foop", "tuna?".getBytes());
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
私も同様の例外に直面しました。互換性のある以下の依存関係を使用し、例外を解決するのに役立ちました。
<dependency>
<groupId>org.Apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.Apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.Apache.curator</groupId>
<artifactId>curator-x-discovery</artifactId>
<version>4.0.1</version>
</dependency>
私も同じ問題を抱えていました。
ここで説明されているように、inTransaction()を使用しようとしました: http://www.programcreek.com/Java-api-examples/index.php?api=org.Apache.curator.framework.CuratorFramework on運動6と動作するようです。
client.inTransaction ().create().forPath("/larry-smells/foop", "tuna?".getBytes()).and ().commit ();
@Massimo Da Rosソリューションは機能しますが、新しいバージョンのCurator 4.0.0ではinTransactionは非推奨になり、以下のようにtransaction
メソッドを使用することをお勧めします。
CuratorOp op = client.transactionOp().create()
.withMode(CreateMode.PERSISTENT)
.withACL(Ids.OPEN_ACL_UNSAFE)
.forPath("/test", "Data".getBytes());
result = client.transaction().forOperations(op).get(0).toString();
この問題は非互換性が原因で発生します。
これを修正するには、ここで説明されているようにバージョンを変更する必要があります。
https://curator.Apache.org/zk-compatibility.html
これが機能しない場合は、3.4.x zookeeperバージョンに依存する最新のキュレーターバージョンを探します(現在'2.12.0'
)。