2016-03-01 21 views
11

Tôi đang cố gắng sử dụng Apache Phụ trách với một trường hợp Zookeeper dockerized và không có vấn đề làm thế nào tôi cố gắng kết nối tôi luôn luôn kết thúc với một lỗilỗi Apache Phụ trách chưa thực hiện khi cố gắng tạo zNodes

org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for...

. Tôi đã cố gắng làm cho tinh thần của các tài liệu hướng dẫn nhưng tôi không nhận được bất cứ nơi nào. Tôi đã đăng nhập vào CLI Zookeeper và đảm bảo số cổng là đúng thusly:

[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 

đây là đoạn code tôi đang cố gắng để sử dụng:

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()); 
      } 

    } 
} 

Theo như tôi có thể nói từ Curator getting started page, thao tác này sẽ hoạt động. Tôi đang thiếu gì?

edit1 chỉ ra rằng tôi có thể lấy dữ liệu ra khỏi quần Zookeeper thusly:

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

nhưng lệnh create vẫn thổi lên.

edit2

stacktrace của lỗi:

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)

Trả lời

27

Chỉnh sửa: Rõ ràng lỗi này có thể xảy ra nếu bạn đang sử dụng sự kết hợp sai lầm của người phụ trách phối hợp với Zookeeper. Từ 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.


Thật khó để xác định vấn đề của bạn với duy nhất mà lỗi mã và không phải là một vết đống, nhưng một số improvments tôi sẽ đề nghị để làm cho ứng dụng của bạn ổn định hơn là:

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

thực hiện thay đổi đề nghị của bạn và nhận được kết quả tương tự. Tôi cũng đã thêm dấu vết ngăn xếp vào văn bản của câu hỏi. –

+0

doots - hóa ra tôi là một dink. vấn đề đã được nêu rõ trong một cảnh báo ở cuối trang chủ của người phụ trách về việc chỉ sử dụng phiên bản v2 với phiên bản dành cho người quản lý vườn thú <3.5.x. Về cơ bản tôi không thành công với RTFM. Nếu bạn đặt nó trong các hình thức của một câu trả lời tôi sẽ chấp nhận nó vì vậy ít nhất bạn nhận được một số cred cho rắc rối của bạn :-) –

2

Tôi gặp vấn đề tương tự.

Tôi đã cố gắng sử dụng inTransaction() như được giải thích tại đây: http://www.programcreek.com/java-api-examples/index.php?api=org.apache.curator.framework.CuratorFramework về bài tập 6 và có vẻ hoạt động.

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

Cảm ơn bạn, điều này là rất hữu ích, đặc biệt là inTransaction() – Alex

0

Vấn đề là do không tương thích.

Để sửa lỗi này, bạn cần phải thay đổi phiên bản như nó đã giải thích ở đây:
https://curator.apache.org/zk-compatibility.html

Nếu điều này không làm việc, chỉ cần nhìn cho phiên bản người phụ trách mới nhất mà phụ thuộc vào một phiên bản 3.4.x Zookeeper (hiện tại '2.12.0').

0

@Massimo Da Ros giải pháp công trình, nhưng trong phiên bản mới 4.0.0 Phụ trách inTransaction bị phản đối, nó recommented sử dụng transaction phương pháp như dưới đây:

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(); 
Các vấn đề liên quan