2016-11-23 18 views
0

У меня есть агент Java, который просматривает представление и получает вложение из каждого документа. Вложение - это ничего, кроме файла .dxl, содержащего данные XML-документа. Я извлекаю файл в какой-то временной каталог и пытаюсь импортировать извлеченный .dxl, как только он будет извлечен.DxlImporter внутри цикла выдает ошибку «Операция импортера 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(); 
    } 

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

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

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

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

+0

Короткий ответ: переместите отдельную операцию по своему методу и ограничьте цикл вызвать метод, переработать и перейти к следующему документу. И переработать !!!! – stwissel

ответ

1

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

Обычно вы бы иметь что-то вроде:

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

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

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

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

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

+0

Привет, спасибо за ответ, но, как я вижу, это набрала ошибку у меня. Но я не выполняю dxlDoc.recycle(); –

+0

Я попытался сделать это решение, но exeption выбрасывает «importer.importDxl (stream, db); « –

+1

несколько вещей, вы абсолютно уверены, что извлеченный файл действителен dxl? Он все еще работает в первый раз и не работает во второй раз?закрытие потока после каждого импорта имеет какое-либо значение? как насчет того, чтобы попытаться поймать внутри цикла, поэтому, если он не сработает на одном документе, он все равно перейдет к следующему. вы на 100% уверены, что dxl всегда является первым внедренным объектом? почему бы не зацикливать вектор? также как побочная нота, которую вы, безусловно, должны перерабатывать внедренные объекты, когда закончите с ними, иначе они не будут очищать временные файлы, которые они тайно создавали. –

 Смежные вопросы

  • Нет связанных вопросов^_^