java - Netflix Curator 交易错误

标签 java transactions apache-zookeeper apache-curator

创建路径时,我在以下代码中收到 NodeExists 错误。

CuratorTransaction transaction = curatorFramework.inTransaction();
transaction.create().forPath("/foo")
        .and().create().forPath("/foo/123")
        .and().create().forPath("/foo")
        .and().commit();

因此,在第一次创建 foo 后,它试图再次创建 foo 。 有什么方法可以在创建路径时检查事务的状态,以便在事务/foo create 中存在,然后它就不会再次创建。

最佳答案

简短的回答是否定的,无法检查您是否尝试创建路径两次。原因是您将整个“blob”作为一个事务提交给zookeeper,从广义上讲,这意味着每个操作都将同时完成。

至少有两种不同的方法可以解决这个问题,或者将每个操作作为单独的操作发送,在这种情况下,您可以这样做:

if(curatorFramework.checkExists().forPath("/foo") == null){
  curatorFramework.create().forPath("/foo");
}

或者,如果应用程序使用事务对于您的应用程序很重要,那么您的应用程序必须控制它不会将两个冲突的操作放入一个事务中。例如,使用在路径上建立索引的 HashMap。

顺便说一句,CuratorTransaction 已被弃用,因此您应该使用 CuratorFramework.transaction()相反。

关于java - Netflix Curator 交易错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35866775/

相关文章:

java - 如何使用 selenium 选择不包含特定类的元素

java - Sharepoint Online REST API 连接

java - 将@Transactional 与 JOOQ 一起使用

apache-zookeeper - 在zookeeper提案请求阶段,追随者节点是否将请求刷新到磁盘?

apache-zookeeper - 动物园管理员 : Connection request from old client will be dropped if server is in r-o mode

java - 为什么Android平台不运行桌面应用程序?

java - 如何在 JPanel/JFrame 中显示 JasperReports Viewer ..?

java - 当我们提供了事务管理 api 时,为什么自动提交在 Hibernate 中默认为 false?

java - 是否可以在单个 JDBC 连接上多路复用多个只读事务

docker - 尝试以非 root 用户身份从容器内部写入已安装的卷时出现问题