2013-02-28 145 views
0

我正在使用java邮件与gmail连接,并且我正在为所有操作保留一个存储。 (商店被设置为静态。)。 IMAPFolder实例附带有imap侦听器。所以文件夹始终保持打开状态。 (文件夹关闭不会随时调用)但是,几分钟后运行,我得到FolderClosedException。在发生异常之后,虽然可以重新打开该文件夹,但不能再次发出idle()命令,这将导致NullPointerException。JavaMail:FolderClosedException频繁发生

保持文件夹总是打开有什么问题吗?

在此先感谢。

============================================== =====================

[编辑] 在这里我粘贴我正在做的POC与实际的代码。在重新连接存储之后检查.isConnected()时出现NullPointerException。以下是将idle()命令发送到商店的Thread的运行方法。

public void run() { 
     while (true) { 
      try { 
       System.out.println("Checking connectivity..."); 

       if (store.isConnected()) { 
        store.idle(); 
        System.out.println("IDLE send..."); 
       } else { 
        Thread.sleep(5000); 
        System.out.println("Tring to connect..."); 

        //Trying to reconnect to the store. 
        store.connect(); 
        System.out.println("Previous store connected again"); 
       } 
      } catch (InterruptedException ex) { 
       System.out.println("InterruptedException..."); 
      } catch (StoreClosedException ex) { 
       System.out.println("StoreClosedException..."); 
      } catch (MessagingException ex) { 
       System.out.println("MessagingException..."); 
      } 
     } 
    } 

这里是堆栈跟踪:

Exception in thread "Thread-1" java.lang.NullPointerException 
at com.sun.mail.imap.IMAPStore.waitIfIdle(IMAPStore.java:1881) 
at com.sun.mail.imap.IMAPStore.getStoreProtocol(IMAPStore.java:946) 
at com.sun.mail.imap.IMAPStore.isConnected(IMAPStore.java:1347) 
at pocworks.POCWorks1$IDLEThread.run(POCWorks1.java:125) 
+0

任何人有任何想法?非常感谢任何建议,因为这非常紧迫。谢谢。 – 2013-02-28 18:38:01

回答

0

一般来说,邮件服务器不喜欢你,当你不使用它们保持打开状态。典型的IMAP服务器在超时未使用的连接之前会给你30分钟的时间; Gmail可能更具侵略性。

+0

非常感谢你香农。当这种超时发生时,邮件客户端应该做什么?我试图重新连接同一个存储区,但是当再次发出idle()命令时它会抛出NullPointException异常。所有IMAPFolders都会重复抛出FolderClosedException,因为它们的侦听器正在运行。
我是否必须重新创建新商店并从头开始从该商店获取IMAPFolders? – 2013-03-01 04:51:12

+0

您可以重新连接存储,但您还需要重新打开文件夹。你可以向我展示你得到的NullPointerException的栈跟踪吗? – 2013-03-01 18:25:31

+0

谢谢比尔的建议。我用代码片段和堆栈跟踪编辑了原始文章。 – 2013-03-04 16:13:05