Как заблокировать узел для процесса удаления - PullRequest
0 голосов
/ 03 августа 2011

В alfresco я хочу удалить узел, но я не хочу, чтобы его использовали другие пользователи в кластерной среде.

Я знаю, что буду использовать LockService для блокировки узла (всреда кластера), как в следующих строках:

lockService.lock(deleteNode);
nodeService.deleteNode(deleteNode);
lockService.unlock(deleteNode);

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

Aсистемная ошибка во время операции: узел не существует: рабочая область: // SpacesStore / cb6473ed-1f0c-4fa3-bfdf-8f0bc86f3a12

Итак, как обеспечить параллелизм в кластерной среде при удалении узла длязапретить двум пользователям доступ к одному и тому же узлу одновременно, один из них хочет обновить его, а второй один раз хочет удалить его?

1 Ответ

1 голос
/ 03 августа 2011

В зависимости от вашей кластерной среды (например, один и тот же сервер БД, используемый всеми экземплярами Alfresco), транзакций, скорее всего, может быть достаточно, чтобы не использовать устаревший контент:

serverA(readNode)
serverB(deleteNode)
serverA(updateNode) <--- transaction failure

JobLockService обеспечивает больший контроль в случае более сложных операций, которые могут включать несколько динамических узлов (или вообще никаких узлов, например, отправку электронных писем или аналогичных):

serverA(acquireLock)
serverB(acquireLock) <--- wait for the lock to be released
serverA(readNode1)
serverA(if something then updateNode2)
serverA(updateNode1)
serverA(releaseLock)
serverB(readNode2)
serverB(releaseLock)
...