Ошибка транзакции куратора Netflix

При создании путей я получаю ошибку NodeExists в следующем коде.

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

Итак, здесь он пытается снова создать foo во второй раз после того, как он был создан в первый раз. Есть ли способ проверить состояние транзакции при создании пути, чтобы в транзакции /foo create существовал, тогда он не будет создаваться снова.


person hatellla    schedule 08.03.2016    source источник


Ответы (1)


Короткий ответ: нет, невозможно проверить, пытаетесь ли вы создать путь дважды. Причина в том, что вы передаете весь «большой двоичный объект» как одну транзакцию в zookeeper, что в широком смысле означает, что все операции будут выполняться одновременно.

Есть как минимум два разных способа решить эту проблему: либо вы отправляете каждую операцию как отдельную операцию, и в этом случае вы можете сделать:

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

Или, если для вашего приложения важно, чтобы оно использовало транзакции, ваше приложение должно контролировать, чтобы оно не помещало две конфликтующие операции в одну транзакцию. Например, с помощью HashMap, проиндексированного по путям.

И кстати, CuratorTransaction устарел, поэтому вам следует использовать CuratorFramework.transaction() вместо этого.

person Petter    schedule 09.03.2016