2012-10-26 42 views
10

我正在閱讀emailServer的電子郵件並將它們保存在database.I使用以下代碼從文件夾中讀取郵件郵件服務器(「INBOX」),並檢索對應給他們的消息,但我得到java.lang.ArrayIndexOutOfBoundsException t at com.sun.mail.imap.MessageCache.getMessage(MessageCache.java:123)

"java.lang.ArrayIndexOutOfBoundsException: message number (621) out of bounds (620) 
at com.sun.mail.imap.MessageCache.getMessage(MessageCache.java:123) 
at com.sun.mail.imap.MessageCache.getMessageBySeqnum(MessageCache.java:153) 
at com.sun.mail.imap.IMAPFolder.getMessageBySeqNumber(IMAPFolder.java:2795) 
at com.sun.mail.imap.IMAPFolder.getMessagesByUID(IMAPFolder.java:1924)" 
我使用javax.mail.1.4.4

,這個問題主要是來當收件箱收到了大量。使用

代碼:

folder = store.getFolder("INBOX"); 

folder.open(Folder.READ_WRITE); 
// messageUID is uid of last message I saved in DB 

Message messages[] = ((UIDFolder) folder).getMessagesByUID(messageUID + 1, UIDFolder.LASTUID); 

我做了一些研究,發現messagecache是​​,一旦它打開設置一個文件夾,讓我們假設它被設置爲520(該文件夾的大小)。而如果消息緩存設置後有任何消息到達,則在最後的消息序列中,num超過消息緩存的總大小,並且會引發異常。

有人可以讓我知道如何獲得文件夾中最後一條消息的UId的絕對值或如何獲取文件夾鎖定,以便在設置了緩存後,文件夾不會更新文件夾的大小。

回答

4

有趣的問題!

首先,我認爲這是javax郵件中的一個錯誤。應該可以撥打checkRange(),撥打getMessageBySeqNumber(),或撥打Math.min()與矢量大小。

在任何情況下,問題是代碼會去服務器以獲取最新的消息數,但從不更新本地messageCache。這意味着messageCache與方法相比具有過時的數據,但該方法仍然假設它是最新的......正如你所看到的hilarity所確保的。

現在,如何避免它,直到它被修復?

不幸的是,我認爲,你被卡住做類似的有些可怕的解決方法:

folder = store.getFolder("INBOX"); 

folder.open(Folder.READ_WRITE); 
// messageUID is uid of last message I saved in DB 

/* I apologize for all of the kittens that this code is about to kill */ 
boolean getMessagesWorked = false; 
do { 
    try { 
    Message messages[] = ((UIDFolder) folder).getMessagesByUID(messageUID + 1, UIDFolder.LASTUID); 
    getMessagesWorked = true; 
    } catch (ArrayIndexOutOfBoundsException e) { 
    /* Doing this should force the internal messagesCache to get updated 
     * Unfortunately, this is also somewhat racy, depending on just how 
     * hard the mail folder is being hit */ 
     try { 
     folder.getMessage(folder.getMessageCount()); 
     } catch (ArrayIndexOutOfBoundsException e) { 
     /* There really isn't much you can do here, except try again. 
     * the good news is that this should hardly ever happen!! 
     * Good in this case is a relative term! */ 
     } 
    } 
} while (! getMessagesWorked); 
+0

感謝這個解決辦法。這個bug是否得到修復?我只是用javax.mail'1.4.7'(最新的穩定版本)運行它,所以我猜不是。 – nicholas79171