循环内的 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 来处理该场景(并报告问题文件),这将允许代理继续而不停止
我有一个 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 来处理该场景(并报告问题文件),这将允许代理继续而不停止