Apache Jackrabbit (JCR), какой API следует использовать для массового удаления - PullRequest
0 голосов
/ 27 мая 2020

У меня есть устаревший проект, который использует Apache Jackrabbit (JCR) версии 2.0 в качестве основного хранилища (немного устарело, но сейчас я не могу его изменить).

Мне нужно очистить хранилище для неиспользуемые узлы и версии, поэтому я перебираю все дерево хранилища, проверяя для каждого узла / версии, следует ли его удалить или нет.

У меня есть объект javax.jcr.Session.

remove API вызывается в for l oop по:

VersionManager vm = session.getWorkspace().getVersionManager();

Node root = session.getRootNode();
NodeIterator nodeIterator = root.getNodes();

for(int currentNode = 0; currentNode < nodeIterator.getSize(); currentNode ++) {

   Node node = nodeIterator.nextNode();

   VersionHistory versionHistory = vm.getVersionHistory(node.getPath());
   VersionIterator versionIterator = versionHistory.getAllVersions();
   for(int currentVersion = 0; currentVersion < versionIterator.getSize(); currentVersion ++) {
      Version version = versionIterator.nextVersion();

      if(shouldDelete(node, version)) {
         versionHistory.removeVersion(version.getName());
      }
   }
}

Проблема в том, что removeVersion API работает очень медленно.

Первый вопрос это если есть какой-либо другой способ go быстрее, учитывая, что когда я выполняю очистку, с хранилищем работает только один поток.

Я изучил javado c и понял что должна быть процедура для выполнения пакетных операций, как в моем случае. Например:

VersionManager vm = session.getWorkspace().getVersionManager();

RepositoryService rs = getRepositoryService(session);
SessionInfo si = getSessionInfo(session);
ItemId mainId = null;
Batch batch = rs.createBatch(si, mainId);

Node root = session.getRootNode();
NodeIterator nodeIterator = root.getNodes();

for(int currentNode = 0; currentNode < nodeIterator.getSize(); currentNode ++) {

   Node node = nodeIterator.nextNode();

   VersionHistory versionHistory = vm.getVersionHistory(node.getPath());
   VersionIterator versionIterator = versionHistory.getAllVersions();
   for(int currentVersion = 0; currentVersion < versionIterator.getSize(); currentVersion ++) {
      Version version = versionIterator.nextVersion();

      if(shouldDelete(node, version)) {
         ItemId id = getItemId(node, version);
         batch.remove(id);

         //versionHistory.removeVersion(version.getName());
      }
   }
}

// TODO: how to execute batch?

У меня есть вопрос по этому пакетному API:

  • как я могу получить RepositoryService от моего Session?
  • как я могу получить SessionInfo из моего Session?
  • , что означает ItemId, переданный при создании объекта Batch? Какое значение мне следует передать?
  • как я могу получить ItemId от узла и его версии?
  • после того, как я построю свой Batch объект со всем его удалением, как я могу выполнить его во время сеанса?

1 Ответ

1 голос
/ 27 мая 2020

AFAIU, Batch и SessionInfo - это интерфейсы в Jackrabbit SPI, который является уровнем ниже JCR API, в основном используется для удаленного взаимодействия (например, через WebDAV).

Я не думаю, что это поможет вам здесь .

...