【问题标题】:Curator transaction runtime construction策展人事务运行时构造
【发布时间】:2015-01-14 19:57:06
【问题描述】:

ZooKeeper 的Apache Curator library 使用了一种很好的“流畅”语法。例如,要修改事务中的多个节点,代码如下所示:

client.inTransaction().
    .setData().forNode(node1Path, data1)
    .and()
    .SetData().forNode(node2Path, data2)
    .and()
    .commit();

这很好用,而且恕我直言,生成的代码非常易读。但是,我有一种情况,我必须在事务中修改一组 ZNode。直到运行时我才知道需要修改多少节点或哪些节点。因此,我认为我不能轻松地使用流利的语法。查看文档,我可以手动管理每个流畅的方法调用返回的代理对象,但是代码需要显式使用CuratorTransactionTransactionSetDataBuilderCuratorTransactionBridge 等。这显然是可行的,但是代码开始看起来很丑。

我没有看到与 Curator 进行交易的非流畅方式。有谁知道是否有一个和/或是否有一种“好”的方式在运行时构建事务?具体来说,给定一个从 ZNode 路径到最终需要在该 ZNode 中的数据的 Map<String, String> 映射,您将如何以事务方式设置所有节点?

【问题讨论】:

    标签: java apache-zookeeper apache-curator


    【解决方案1】:

    给猫剥皮的一种方法?:

    CuratorTransaction curatorTransaction = client.inTransaction();
    
    for (Map.Entry<String, String> entry : transactionInfo.entrySet()) {
        curatorTransaction = curatorTransaction
            .setData().forNode(entry.getKey(), entry.getValue()).and();
    }
    
    // If there was at least one entry in transactionInfo, and() makes it a CuratorTransactionFinal
    if (curatorTransaction instanceof CuratorTransactionFinal) {
        ((CuratorTransactionFinal)curatorTransaction).commit();
    }
    

    【讨论】:

    • 非常好!我没有意识到 CuratorTransactionFinal 是 CuratorTransaction 的子类。
    • 这行得通,但是 Curator API(注意:我是主要作者)在这里需要改进。我们将在此感谢您的任何贡献(或至少是公开票):issues.apache.org/jira/browse/CURATOR
    【解决方案2】:

    我使用馆长进行 zookeeper 交易,首先我做一些这样的事情

    uratorTransaction.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL)
                                .forPath().and();then I commit it like bfos',but the commit method can't  returned,and the exception in the log file is like this:
    org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
        at org.apache.zookeeper.ZooKeeper.multiInternal(ZooKeeper.java:932)
        at org.apache.zookeeper.ZooKeeper.multi(ZooKeeper.java:912)
        at org.apache.curator.framework.imps.CuratorTransactionImpl.doOperation(CuratorTransactionImpl.java:159)
        at org.apache.curator.framework.imps.CuratorTransactionImpl.access$200(CuratorTransactionImpl.java:44)
        at org.apache.curator.framework.imps.CuratorTransactionImpl$2.call(CuratorTransactionImpl.java:129)
        at org.apache.curator.framework.imps.CuratorTransactionImpl$2.call(CuratorTransactionImpl.java:125)
        at org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:107)
        at org.apache.curator.framework.imps.CuratorTransactionImpl.commit(CuratorTransactionImpl.java:121)
    

    【讨论】:

      猜你喜欢
      • 2010-11-09
      • 2014-11-17
      • 2019-04-25
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多