Java 策展人事务运行时构造

Java 策展人事务运行时构造,java,apache-zookeeper,apache-curator,Java,Apache Zookeeper,Apache Curator,ZooKeeper使用了一种很好的“流畅”语法。例如,要修改事务中的多个节点,代码如下所示: client.inTransaction(). .setData().forNode(node1Path, data1) .and() .SetData().forNode(node2Path, data2) .and() .commit(); 这非常有效,而且,IMHO,生成了非常可读的代码。但是,我有一种情况,我必须修改事务中的一组znode。直到运行时,我

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

client.inTransaction().
    .setData().forNode(node1Path, data1)
    .and()
    .SetData().forNode(node2Path, data2)
    .and()
    .commit();
这非常有效,而且,IMHO,生成了非常可读的代码。但是,我有一种情况,我必须修改事务中的一组znode。直到运行时,我才知道需要修改多少节点,或者哪些节点。因此,我认为我不能轻易地使用流利的语法。查看文档,我可以手动管理每个fluent方法调用返回的代理对象,但是代码需要显式使用
CuratorTransaction
TransactionSetDataBuilder
CuratorTransactionBridge
,等等。这显然是可以做到的,但代码开始看起来非常难看


我认为没有一种不流畅的方式来与馆长进行交易。是否有人知道是否有一个和/或是否有一种在运行时构建事务的“好”方法?具体来说,给定从ZNode路径到需要在该ZNode中结束的数据的
Map
映射,您将如何以事务方式设置所有节点?

一种给猫蒙皮的方法:

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();
}
CuratorTransaction CuratorTransaction=client.inTransaction();
对于(Map.Entry:transactionInfo.entrySet()){
curatorTransaction=curatorTransaction
.setData().forNode(entry.getKey()、entry.getValue())和();
}
//如果transactionInfo中至少有一个条目,则and()使其成为CuratorTransactionFinal
if(策展交易实例策展交易最终版){
((CuratorTransactionFinal)curatorTransaction).commit();
}

给猫剥皮的一种方法是:

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();
}
CuratorTransaction CuratorTransaction=client.inTransaction();
对于(Map.Entry:transactionInfo.entrySet()){
curatorTransaction=curatorTransaction
.setData().forNode(entry.getKey()、entry.getValue())和();
}
//如果transactionInfo中至少有一个条目,则and()使其成为CuratorTransactionFinal
if(策展交易实例策展交易最终版){
((CuratorTransactionFinal)curatorTransaction).commit();
}

我使用管理员进行动物园管理员交易,首先我会这样做

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)

我用馆长做一个动物园管理员的交易,首先我做一些这样的事情

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)

很不错的!我没有意识到CuratorTransactionFinal是CuratorTransaction的一个子类。这是可行的,但Curator API(注:我是主要作者)需要改进。我们将感谢您的任何贡献(或至少是一张公开票):非常好!我没有意识到CuratorTransactionFinal是CuratorTransaction的一个子类。这是可行的,但Curator API(注:我是主要作者)需要改进。我们非常感谢您的任何贡献(或至少是一张公开票):