2012-10-26 8 views
10

Czytam wiadomości e-mail z serwera poczty elektronicznej i zapisuję je w bazie danych. Używam następującego kodu do czytania wiadomości z folderu („INBOX”) na serwerze poczty elektronicznej i pobierać wiadomości odpowiadające im ale jestem corazjava.lang.ArrayIndexOutOfBoundsException t na 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)" 

używam javax.mail.1.4.4 kwestia ta zbliża się głównie wtedy, gdy skrzynka odbiorcza jest coraz zalane.

kod używany:

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); 

Zrobiłem rozeznanie i okazało się, że messagecache jest ustawiony dla folderu, jak tylko otwiera, pozwala przypuszczać, że to jest ustawiona jako 520 (wielkości folderu). Natomiast jeśli nadejdzie wiadomość po ustawieniu pamięci podręcznej wiadomości, to w ostatniej sekwencji wiadomości liczba przekracza całkowity rozmiar pamięci podręcznej wiadomości i zgłasza wyjątek.

Czy ktoś może mi powiedzieć, jak uzyskać bezwzględną wartość UId z ostatniej wiadomości w folderze lub jak uzyskać blokadę folderu, tak aby po ustawieniu cache folder nie aktualizuje rozmiar folderu.

Odpowiedz

4

Interesujący problem!

Po pierwsze, myślę, że jest to błąd w javax mail. Prawdopodobnie powinno być połączenie z checkRange() w getMessageBySeqNumber() lub po prostu Math.min() z rozmiarem wektorowym.

W każdym razie problem polega na tym, że kod przechodzi na serwer, aby uzyskać najnowszą liczbę wiadomości, ale nigdy nie aktualizuje lokalnej wiadomości. Oznacza to, że messageCache ma nieaktualne dane w porównaniu do metody, ale metoda nadal zakłada, że ​​jest aktualna ... jak zapewnił was wesołość.

Teraz, jak tego uniknąć, dopóki nie zostanie naprawiony?

Niestety, myślę, że są skazani na nieco strasznej obejście robienia czegoś jak:

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

Dzięki za tego obejścia. Czy ten błąd został naprawiony? Po prostu wpadłem na to używając javax.mail '1.4.7' (najnowsza stabilna kompilacja), więc nie zgaduję. – nicholas79171

Powiązane problemy