21

我正在尝试将 Apache Curator 与 dockerized zookeeper 实例一起使用,无论我如何尝试连接,我总是以

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

    }
}

据我从策展人入门页面可以看出,这应该可行。我错过了什么?

edit1 刚刚发现我能够从 zookeeper 合奏中提取数据:

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

但创建命令仍在爆炸。

编辑2

错误的堆栈跟踪:

org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = org.apache.zookeeper.KeeperException.create(KeeperException.java:103) 的 /larry-smells/foop 在 org.apache.zookeeper.KeeperException.create(KeeperException. java:51) 在 org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:1297) 在 org.apache.curator.framework.imps.CreateBuilderImpl$17.call(CreateBuilderImpl.java:1040) 在 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 的 org.apache.curator.framework.imps.CreateBuilderImpl.pathInForeground(CreateBuilderImpl.java:1020)。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) 在 org.apache.curator.framework.imps.CreateBuilderImpl$4.forPath(CreateBuilderImpl.java:309) 在 com.mycompany.app.App.main(App.java:35)主要(App.java:35)主要(App.java:35)

4

5 回答 5

45

编辑:显然,如果您将 Curator 与 Zookeeper 结合使用错误的组合,则可能会发生此错误。来自curator.apache.org

Curator 2.xx - 与 ZooKeeper 3.4.x 和 ZooKeeper 3.5.x 兼容

Curator 3.xx - 仅与 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());
            }

    }
}
于 2016-03-02T17:20:59.193 回答
3

我也遇到了类似的异常,我使用了以下兼容的依赖项并帮助我解决异常。

    <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>
于 2018-10-09T10:27:23.583 回答
2

我有同样的问题。

我尝试按照此处的说明使用 inTransaction ():http: //www.programcreek.com/java-api-examples/index.php? api=org.apache.curator.framework.CuratorFramework在练习 6 中似乎有效。

client.inTransaction ().create().forPath("/larry-smells/foop", "tuna?".getBytes()).and ().commit ();
于 2017-08-10T21:41:02.480 回答
1

该问题是由于不兼容引起的。

要解决此问题,您需要更改版本,如下所述:
https ://curator.apache.org/zk-compatibility.html

如果这不起作用,只需查找依赖于 3.4.x zookeeper 版本(当前'2.12.0')的最新 curator 版本。

于 2017-11-09T05:23:15.577 回答
0

@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();
于 2018-01-25T03:08:44.210 回答