Массовый поиск и обновление FileNet

У меня есть требование, при котором я должен обновлять метаданные документа для миллионов документов в хранилище объектов. Так что я написал простой Java-автономный с нижеприведенным подходом

SearchSQL documentSearchSQL = new SearchSQL();
String selectQuery = "Id ";
String classSymbolicName="Document_Class_Name";
String myAlias1 = "r";
String whereClause="r.Document_Type_Code='DIRMKTGDOC'and VersionStatus=1"
boolean subClassesToo=false;
documentSearchSQL.setSelectList(selectQuery);
documentSearchSQL.setFromClauseInitialValue(classSymbolicName, myAlias1, subClassesToo);
documentSearchSQL.setWhereClause(whereClause);

UpdatingBatch updatingBatch =null;
SearchScope searchScope = new SearchScope(p8ObjectStore);
RepositoryRowSet rowSet = searchScope.fetchRows(documentSearchSQL, new Integer(10000), null, new Boolean(true));
PageIterator pageIterator = rowSet.pageIterator();
RepositoryRow row;
Document document = null;

while(pageIterator.nextPage()){
Object[] rowArray = pageIterator.getCurrentPage();
updatingBatch = UpdatingBatch.createUpdatingBatchInstance(p8ObjectStore.get_Domain(),RefreshMode.NO_REFRESH); 
for (int i = 0; i < rowArray.length; i++) {
row= (RepositoryRow)rowArray[i];
Properties documentProps = row.getProperties();
document = Factory.Document.fetchInstance(p8ObjectStore, documentProps.getIdValue("Id"), null);
// I have the metadata symbolic name and its values within HashMap. So iterating Map to set the values
for(Map.Entry<String, ArrayList<String>> documentMetadata : documentMetadataValues.entrySet()){
document.getProperties().putObjectValue(documentMetadata.getKey(), documentMetadata.getValue().get(1));
}
updatingBatch.add(document, null);
}
updatingBatch.updateBatch();

Когда я запустил запрос к docVersion, я обнаружил около 700 тыс. Документов, соответствующих критериям, и ожидал, что все они будут обновлены. Когда я запустил программу, она обновила около 390 тыс. Документов, а затем выдала ошибку

com.filenet.api.exception.EngineRuntimeException: FNRCA0031E: API_UNABLE_TO_USE_CONNECTION: The URI for server communication cannot be determined from the connection object http://server:port/wsi/FNCEWS40MTOM. Message was: Connection refused: connect

Есть ли лучший способ добиться этого? Кроме того, я буду использовать очередь компонентов для запуска этого инструмента в производстве.

2 ответа

Решение

На самом деле у вас есть 2 лучших варианта сделать это, используя основанные на сценарии массовые действия или развертки.


Массовые действия

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

  1. Доступ к поиску хранилища объектов в консоли администратора
  2. На вкладке представления SQL введите соответствующий запрос.
  3. На вкладке " Массовые действия" выберите " Включить".
  4. В разделе "Сценарий" выберите " Выполнить сценарий".
  5. Введите свой код JavaScript в поле "Сценарий". Для получения дополнительной информации см. Пример ниже.
  6. Нажмите Run. Консоль администрирования выполняет запрос и действие JavaScript.

importClass(Packages.com.filenet.api.property.Properties);
importClass(Packages.com.filenet.api.constants.RefreshMode);

function OnCustomProcess(CEObject) {
  CEObject.refresh();
  CEObject.getProperties().putValue("DocumentTitle", "Test1");
  CEObject.save(RefreshMode.REFRESH);
}

Подробнее об этом вы можете узнать в центре знаний здесь


Custom Sweep Job

В качестве альтернативы вы можете использовать пользовательскую работу развертки. Развертка - это экземпляр фоновой службы, которую вы настраиваете для обработки объектов в таблице базы данных. Если объект соответствует настроенным критериям, развертка выполняет действие над объектом. Развертка состоит из действия развертки и задания развертки

  1. В области навигации по домену щелкните хранилище объектов. В области навигации хранилища объектов щелкните правой кнопкой мыши папку Sweep Management > Sweep Actions и выберите New Sweep Action.
  2. Выберите тип действия. в этом примере давайте выберем сценарий Java, пример приведен ниже и завершим работу мастера.
  3. В области навигации по домену выберите хранилище объектов. В области навигации хранилища объектов выберите " Управление развертками"> "Очистка заданий"> " Папка пользовательских заданий " и нажмите " Создать", обратитесь к только что созданному действию и завершите работу мастера. Теперь все готово! запустить работу по подметанию

importPackage(Packages.com.filenet.api.core);
importPackage(Packages.com.filenet.api.constants);
importPackage(Packages.com.filenet.api.exception);
importPackage(Packages.com.filenet.api.sweep);
importPackage(Packages.com.filenet.api.engine);

// Implement for custom job and queue sweeps.
function onSweep(sweepObject, sweepItems) {
  var hcc = HandlerCallContext.getInstance();
  hcc.traceDetail("Entering CustomSweepHandler.onSweep");
  hcc.traceDetail("sweepObject = " +
    sweepObject.getProperties().getIdValue(PropertyNames.ID) +
    "sweepItems.length = " + sweepItems.length);

  // Iterate the sweepItems and change the class.
  idx = 0;
  for (idx = 0; idx < sweepItems.length; idx++) {
    // At the top of your loop, always check to make sure 
    // that the server is not shutting down. 
    // If it is, clean up and return control to the server.
    if (hcc != null && hcc.isShuttingDown()) {
      throw new EngineRuntimeException(ExceptionCode.E_BACKGROUND_TASK_TERMINATED,
        this.constructor.name + " is terminating prematurely because the server is shutting down");
    }

    var item = sweepItems[idx].getTarget();
    String msg = "sweepItems[" + idx + "]= " + item.getProperties().getIdValue("ID");
    hcc.traceDetail(msg);

    try {
      var CEObject = Document(item);
      CEObject.getProperties().putValue("DocumentTitle", "Test1");
      CEObject.save(RefreshMode.NO_REFRESH);

      // Set outcome to PROCESSED if item processed successfully.
      sweepItems[idx].setOutcome(SweepItemOutcome.PROCESSED,
        "item processed by " + this.constructor.name);
    }
    // Set failure status on objects that fail to process.
    catch (ioe) {
      sweepItems[idx].setOutcome(SweepItemOutcome.FAILED, "CustomSweepHandler: " +
        ioe.rhinoException.getMessage());
    }
  }
  hcc.traceDetail("Exiting CustomSweepHandler.onSweep");
}

/* 
 * Called automatically when the handler is invoked by a custom sweep job 
 * or sweep policy. Specify properties required by the handler, if any.
 * If you return an empty array, then all properties are fetched.
 */
function getRequiredProperties() {
  var pnames = ['Id', 'DocumentTitle'];
  return pnames.toString();
}

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

Этот код выдает ошибку:

FNRAC1005E Объект «безопасность обновления» не был сохранен.

Действия пользователя: Обновите объект, повторно введите изменения и повторите попытку или обратитесь к системному администратору.

Сведения об исключении: при запуске скрипта произошла ошибка. Сообщение было: отсутствует; перед оператором (#26)

Другие вопросы по тегам