DxlImporter внутри цикла выдает ошибку "Ошибка операции импорта DXL"

У меня есть Java-агент, который просматривает представление и получает вложение из каждого документа. Вложение - это не что иное, как файл.dxl, содержащий данные XML-документа. Я извлекаю файл из некоторого временного каталога и пытаюсь импортировать извлеченный.dxl, как только он будет извлечен.

Но проблема здесь в том, что он импортирует или работает только с первым вложенным документом в цикле и выдает ошибку в консоли отладки Java.

NotesException: DXL importer operation failed
at lotus.domino.local.DxlImporter.importDxl(Unknown Source)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)

Мой код Java-агента

public class JavaAgent extends AgentBase {
static DxlImporter importer = null;

public void NotesMain() {

  try {
      Session session = getSession();
      AgentContext agentContext = session.getAgentContext();



      // (Your code goes here) 
      // Get current database
      Database db = agentContext.getCurrentDatabase();

      View v = db.getView("DXLProcessing_mails");
      DocumentCollection dxl_tranfered_mail = v.getAllDocumentsByKey("dxl_tranfered_mail"); 
      Document dxlDoc = dxl_tranfered_mail.getFirstDocument();
      while(dxlDoc!=null){

          RichTextItem rt = (RichTextItem) dxlDoc.getFirstItem("body");

          Vector allObjects= rt.getEmbeddedObjects();

          System.out.println("File name is "+ allObjects.get(0));
          EmbeddedObject eo = dxlDoc.getAttachment(allObjects.get(0).toString()); 
          if(eo.getFileSize()>0){
         eo.extractFile(System.getProperty("java.io.tmpdir") + eo.getName()); 

          System.out.println("Extracted File to "+System.getProperty("java.io.tmpdir") + eo.getName());
           String filePath = System.getProperty("java.io.tmpdir") + eo.getName();
           Stream stream = session.createStream();
          if (stream.open(filePath) & (stream.getBytes() >0)) {
            System.out.println("In If"+System.getProperty("java.io.tmpdir"));

             importer = session.createDxlImporter();
           importer.setDocumentImportOption(DxlImporter.DXLIMPORTOPTION_CREATE);
                  System.out.println("Break Point");

        importer.importDxl(stream,db);
        System.out.println("Imported Sucessfully");
      }else{
          System.out.println("In else"+stream.getBytes());


      }

      }
            dxlDoc = dxl_tranfered_mail.getNextDocument();   

   }
   } catch(Exception e) {
      e.printStackTrace();
   }

Код выполняется до тех пор, пока не будет напечатано "Точка останова" и выдает ошибку, но вложение будет импортировано в первый раз

В другом случае, если я жестко закодировал filePath для конкретного файла dxl из файловой системы, он импортирует dxl как документ в базу данных без ошибок.

Мне интересно, если это проблема, когда переданный поток не завершается и выполняется следующий цикл.

Любое предложение будет полезно.

1 ответ

Решение

Я не вижу ни одной части, где ваш цикл while переместился бы с первого документа.

Обычно у вас будет что-то вроде:

Document nextDoc = dxl_tranfered_mail.getNextDocument(dxlDoc);
dxlDoc.recycle();
dxlDoc = nextDoc;

В конце цикла, чтобы перейти к следующему документу. В настоящее время ваш код выглядит так, как будто он никогда не будет продвигаться и всегда будет в первом документе.

Если вы не знаете о необходимости "перерабатывать" объекты домино, я предлагаю вам поискать статьи в блогах, которые объясняют необходимость этого. Это немного сложно, но в основном объекты Java являются просто "оберткой" для объектов в C API. Всякий раз, когда вы создаете объект Domino (такой как Document, View, DocumentCollection и т. Д.), Дескриптор памяти выделяется в нижележащем слое "C". Это должно быть освобождено (или переработано), и это в конечном итоге будет сделано, когда сеанс будет перезагружен, однако, когда вы обрабатываете в цикле, гораздо важнее перезапустить его, так как вы можете легко исчерпать доступные дескрипторы памяти и вызвать сбой.

Также возможно, что вам может потребоваться закрыть (и перезапустить) каждый поток после завершения импорта каждого файла.

Наконец, дважды проверьте, что извлеченный файл, который вызывает исключение, определенно является допустимым файлом DXL, возможно, просто некоторые из вложений не являются допустимым DXL и всегда будут вызывать исключение. Вы можете поместить try/catch в цикл для обработки этого сценария (и сообщить о проблемных файлах), что позволит агенту продолжить работу без остановки

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