2016-03-01 3 views
11

を作成しようとします。私はドキュメントを理解しようとしましたが、私はどこにもいません。私は、飼育係のCLIにログインし、ポート番号は以下のようなものを正しい確保しました:ここ

[email protected]:~$ 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 getting started page、これは動作するはずです。私は何が欠けていますか?

EDIT1 はちょうど私は以下のようなものを飼育係のアンサンブルからデータをプルすることができるよということを考え出し:

System.out.println(new String(curatorFramework.getData().forPath("/larry-smells"))); 

が、createコマンドはまだ吹いています。

EDIT2

エラーのスタックトレース:

org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /larry-smells/foop at org.apache.zookeeper.KeeperException.create(KeeperException.java:103) at org.apache.zookeeper.KeeperException.create(KeeperException.java:51) at 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) at 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.framework.imps.CreateBuilderImpl.forPath(CreateBuilderImpl.java:491) at org.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)

答えて

27

編集:あなたは飼育係との組み合わせでキュレーターの間違った組み合わせを使用している場合はどうやらこのエラーが発生する可能性があります。 curator.apache.orgから:

Curator 2.x.x - compatible with both ZooKeeper 3.4.x and ZooKeeper 3.5.x

Curator 3.x.x - compatible only with ZooKeeper 3.5.x and includes support for new features such as dynamic reconfiguration, etc.


それだけでそのエラーコードではなく、スタックトレースを使用して問題を特定するのは難しいが、私はあなたのaplicationをより安定にすることをお勧めいくつかも改善は次のとおりです。

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 parants are created. 
      client.create().creatingParentsIfNeeded().forPath("/larry-smells/foop", "tuna?".getBytes()); 
     } catch (Exception e) { 
      System.out.println(e.toString()); 
      } 

    } 
} 
+0

はあなたの推奨される変更を行い、同じ結果を得ました。私はまた、質問のテキストにスタックトレースを追加しました。 –

+0

ドゥーツ - 私はディンクです。 zookeeperバージョン<3.5.xのv2のみを使用していることに関するキュレーターのホームページの最下部に警告が表示されていました。基本的に私はRTFMに失敗しました。あなたが答えの形でそれを入れたら、私はそれを受け入れるでしょう、少なくともあなたはあなたのトラブルのためにいくつかの信用を得ます:-) –

2

私は同じ問題を抱えていました。

ここで説明するように、私はinTransaction()を使用しようとしました:エクササイズでは、 と思われます。

client.inTransaction().create().forPath("/larry-smells/foop", "tuna?".getBytes()).and().commit(); 
+0

ありがとう、これは非常に便利です、特にinTransaction() – Alex

0

問題があるため非互換性の原因です。
https://curator.apache.org/zk-compatibility.html

これが動作しない場合は、単に(バージョン3.4.xの飼育係のバージョンによって異なり、最新のキュレーターバージョンを探し、:それはここでは説明しているよう

は、この問題を解決するには、バージョンを変更する必要があります現在'2.12.0')。

0

@MassimoダRosのソリューションが動作しますが、新しいバージョンのキュレーターで4.0.0 inTransactionは廃止され、それが使用することをrecommentedています以下のような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(); 
関連する問題

 関連する問題