2013-08-12 2 views
0

Apache Curator library для ZooKeeper использует хороший «плавный» синтаксис. Например, чтобы изменить несколько узлов в транзакции, код выглядит примерно так:Куратор транзакции времени исполнения

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

Это прекрасно работает и, ИМХО, производит очень читаемый код. Однако у меня есть ситуация, когда мне приходится изменять набор ZNodes в транзакции. Я не знаю до тех пор, пока не будет изменено количество узлов или узлов. Таким образом, я не думаю, что могу свободно использовать свободный синтаксис. Глядя на документы, я могу вручную управлять прокси-объектами, каждый из которых быстро возвращается на вызов метода, но тогда код требует явного использования CuratorTransaction, TransactionSetDataBuilder, CuratorTransactionBridge и т. Д. Это явно работает, но код начинает выглядеть действительно уродливым ,

Я не вижу неходового способа совершать транзакции с Куратором. Кто-нибудь знает, есть ли он и/или есть ли «хороший» способ построить транзакцию во время выполнения? В частности, при сопоставлении Map<String, String> с пути ZNode к данным, которые должны быть в конечном итоге в этом ZNode, как бы вы установили все узлы на транзакции?

ответ

2

Один способ кожи кошки ?:

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

Очень красивый! Я не понял, что CuratorTransactionFinal является подклассом CuratorTransaction. –

+0

Это работает, но API-интерфейс куратора (ПРИМЕЧАНИЕ: Я главный автор) нуждается в улучшении. Мы будем благодарны за любые вклады (или, по крайней мере, открытый билет) здесь: https://issues.apache.org/jira/browse/CURATOR – Randgalt

0

Я использую куратору для сделки 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) 
Смежные вопросы