【问题标题】:Extracting attachments from lotus notes api using EmbeddedObject, Creating eo*tm file in system folder使用 EmbeddedObject 从 lotus notes api 中提取附件,在系统文件夹中创建 eo*tm 文件
【发布时间】:2012-09-20 16:26:27
【问题描述】:

我正在尝试使用 EmbeddedObjects 提取附件,我能够提取附件但在系统临时文件夹中创建 em*tm 临时文件。

 EmbeddedObject embeddedObject=document.getAttachment(attachmentName);
 InputStream inputStream=embeddedObject.getInputStream();
 .....
 ......
 inputStream.close();
 embeddedObject..recycle();
 document..recycle();

关闭输入流后,它不会从系统临时文件夹中删除临时文件。 我的代码有什么问题吗?或者它的 Lotus Notes 设置问题。

你能帮帮我吗?

感谢您的帮助。

【问题讨论】:

  • embeddedObject.recycle();文档.recycle();抱歉,它的 .recycle();它不是 ..recycle();
  • 嗯...我之前在忘记关闭 InputStream 时遇到了这些临时文件。事实上,我向 IBM 提交了一份报告,因为当时文档从未提及关闭流的要求。现在确实如此。事实上,该文档现在包含了我向 IBM 建议的确切语言。所以这很神秘。如果这是一个通常可重现的场景,那将是一个严重的错误。您使用的是哪个版本的 Notes 或 Domino?
  • 感谢您的回复,我使用的是 Lotus Notes 8。
  • 这是代理还是独立 Java 代码?单线程还是多线程?
  • 它的独立 java 程序。它的单线程。

标签: lotus-notes lotus-domino lotus


【解决方案1】:

这是一个常见问题,它与对象的不正确关闭/回收(丢失或乱序)有关。 E0*TM 文件将在对象存活时创建,并在回收时清理。

如果它们正确,请检查是否有任何正在运行的防病毒软件阻止删除。

我之前用来测试的以下示例代码有效,因此请与您的进行比较。

  try { 

   System.out.println("Start"); 
   String path = "test.txt";    

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

   System.out.println("Get DB");    
   Database db = session.getCurrentDatabase();  

   System.out.println("View + doc");    
   View vw = db.getView("main");    
   Document doc = vw.getFirstDocument();    

   System.out.println("Embedded object");   
   EmbeddedObject att = doc.getAttachment(path);    
   InputStream is = att.getInputStream();   
   ByteArrayOutputStream fos = new ByteArrayOutputStream(); 

   byte buffer[] = new byte[(int) att.getFileSize()];   
   int read;    
   do { 
    read = is.read(buffer, 0, buffer.length);   
    if (read > 0) { 
     fos.write(buffer, 0, read);    
    }   
   } while (read > -1); 

   fos.close(); 
   is.close();

   // recycle the domino variables  
   doc.recycle();   
   vw.recycle();    
   db.recycle();    
   att.recycle();   

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

【讨论】:

  • 我的代码也和你的代码类似。我正在阅读所有电子邮件并回收我的多米诺骨牌对象 for(int i=0;i
  • 代理完成后,是否会清理文件?如果没有,请尝试使用 Sysinternals 工具进程管理器来监控正在触及这些文件的内容。
【解决方案2】:

我的建议是首先将您在帖子中表示的所有代码注释为

.....
......

临时文件是否仍然被遗忘?如果是这样,它看起来像是 8.x 的 Notes 后端类中的一个错误,需要向 IBM 报告。

如果不是,那么注释掉的代码中的某些内容会阻止 close() 调用成功。 InputStream 是一个抽象类,因此您可能正在将 inputStream 绑定到另一种类型的流对象,该对象必须关闭以防止文件保持打开状态。

【讨论】:

  • ......之间的代码是创建新的DTO(数据传输对象)对象并将所有附件属性和文档标题信息放在DTO对象中。附件属性意味着附件名称、大小、来自地址等...我试图注释掉仍然在创建 eo..tm 文件的所有内容。我写了一个批处理文件,每小时删除一次。它是一种解决方法,但不是解决方法。谢谢你的帮助。赞赏
  • 这是非常有趣的信息。谢谢。我将不得不去检查我们使用 EmbeddedObject.getInputStream() 的代码,看看它是否已经回到留下文件的状态。
  • 进一步思考:您的代码是否可能正在吞噬异常而实际上并未调用 recyle() 方法?为了确定,我通常将 recycle() 调用放入 finally{} 块中。 (我还在调用 recycle() 之前检查 null,以防异常阻止对象首先被实例化。)
  • 我正在回收我所有的莲花笔记对象,仍然没有线索:(
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多