JavaMail中Folder is not open及OutOfMemory 错误解决办法

1、Folder is not Open 异常


 在运行时,在邮箱邮件比较多的情况下,大概每次在收取大概5分钟左右,就会报下面的异常:
 java.lang.IllegalStateException: Folder is not Open
 at com.sun.mail.pop3.POP3Folder.checkOpen(POP3Folder.java:422)
 at com.sun.mail.pop3.POP3Folder.close(POP3Folder.java:193)
 
 在每次读取一个folder时,先判断是否close,如果close就在重新打开一次,这样就解决了,详见下面的代码:

Message message[] = folder.getMessages();  
 System.out.println("收件箱总数: " + message.length);  
 for (int i = 0; i < message.length; i++) { 
   if(!message[i].getFolder().isOpen()) //判断是否open  
   message[i].getFolder().open(Folder.READ_WRITE) //如果close,就重新open    
 } 

注意:上面的两行注释,每次for循环打开一个新的message时,先判断和这个message里面的folder是否是close的,如果close,就重新打开。 这样,就可以解决Folder is not open异常了。


 2、OutOfMemory 异常


 在收阅邮件中,如果含有大量的附件,并且在时间较长的情况下,会报OutOfMemory 异常。
 方法:POP3Message.invalidate(true);// 使缓存失效
 api如下:
 invalidate
 public void invalidate(boolean invalidateHeaders)Invalidate the cache of content for this message object, causing it to be fetched again from the server the next time it is needed. If invalidateHeaders is true, invalidate the headers as well.

 Parameters:
 invalidateHeaders - invalidate the headers as well?
 
 啥意思,如果是true,就每次不往缓存中添加内容,false还会添加,默认为false的。

Message message[] = folder.getMessages();  
 System.out.println("收件箱总数: " + message.length);  
 for (int i = 0; i < message.length; i++) {    
  if(!message[i].getFolder().isOpen())  
  message[i].getFolder().open(Folder.READ_WRITE);  
 printMessage(message[i]);              
  
 POP3Message)message[i]).invalidate(true); // 每封邮件读取完后,设置不往cache中添加  
  
 } 

猜你喜欢

转载自blog.csdn.net/m_crayon/article/details/104761314
今日推荐