循环内的 DxlImporter 抛出错误“DXL 导入器操作失败”

DxlImporter inside a loop throws error " DXL importer operation failed"

我有一个 java 代理,它遍历视图并从每个文档获取附件,附件只是包含文档 xml 数据的 .dxl 文件。我在某个临时目录中提取文件,并在提取后立即尝试导入提取的 .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();
   }

代码执行直到打印 "Break Point" 并抛出错误,但第一次导入附件

在其他情况下,如果我对来自文件系统的特定 dxl 文件的文件路径进行硬编码,它会将 dxl 作为文档导入数据库而不会出现错误

我想知道是不是流传递没有完成,下一个循环执行的问题。

任何类型的建议都会有所帮助。

我看不到您的 while 循环会从第一个文档继续前进的任何部分。

通常你会有这样的东西:

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

接近循环末尾以将其推进到下一个文档。正如您的代码目前所显示的那样,它看起来永远不会前进,并且总是在第一个文档中。

如果您不知道 'recycle' 多米诺骨牌对象的必要性,我建议您搜索一些解释这样做必要性的博客文章。 它有点复杂,但基本上,Java 对象只是 C API 中对象的 'wrapper'。 每当您创建 Domino 对象(例如文档、视图、文档集合等)时,都会在底层 'C' 层中分配一个内存句柄。这需要被释放(或回收),它最终会在会话被回收时这样做,但是当您在循环中处理时,回收更为重要,因为您很容易耗尽可用内存句柄并导致崩溃。

此外,您可能需要在完成每个文件的导入后关闭(并回收)每个 Stream

最后,仔细检查导致异常的提取文件是否确实是有效的 DXL 文件,可能只是某些附件不是有效的 DXL,并且总是会引发异常。 您可以在循环中放置一个 try/catch 来处理该场景(并报告问题文件),这将允许代理继续而不停止