2012-10-26 6 views
10

Ich lese E-Mails von emailServer und speichern sie in der Datenbank.Ich verwende folgenden Code, um Nachrichten aus dem Ordner zu lesen („Inbox“) auf E-Mail-Server und abrufen von Nachrichten, die ihnen entsprechen, aber ich bin immerjava.lang.ArrayIndexOutOfBoundsException t bei 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)" 

ich javax.mail.1.4.4 verwende, diese Frage kommt in erster Linie, wenn Posteingang überschwemmt zu werden.

-Code verwendet:

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

Ich habe einige der Forschung getan und festgestellt, dass messagecache für einen Ordner festgelegt wird, sobald sie sich öffnet, lässt annehmen, dass es als 520 (Größe des Ordners) festgelegt ist. Wenn jedoch eine Nachricht ankommt, nachdem der Nachrichtencache festgelegt wurde, überschreitet die letzte Nachrichtensequenznummer die Gesamtgröße des Nachrichtencaches und löst eine Ausnahme aus.

Kann mir jemand wissen, wie man absoluten Wert von UId der letzten Nachricht in einem Ordner oder wie eine Ordnersperre erhalten, so dass nach dem Cache festgelegt wird, aktualisiert Ordner nicht die Größe des Ordners.

Antwort

4

Interessantes Problem!

Erstens denke ich, dass dies ein Fehler in der javax Mail ist. Es sollte wahrscheinlich eine Verbindung zu checkRange() in getMessageBySeqNumber() oder nur eine Math.min() mit der Vektorgröße sein.

In jedem Fall ist das Problem, dass der Code an den Server geht, um die neueste Anzahl der Nachrichten zu erhalten, aber aktualisiert nie die lokale MessageCache. Das bedeutet, dass der messageCache veraltete Daten im Vergleich zur Methode hat, die Methode jedoch immer noch davon ausgeht, dass sie auf dem neuesten Stand ist ... wie Sie sehen, Heiterkeit gewährleistet.

Nun, wie kann man es vermeiden, bis es behoben ist?

Leider denke ich, dass man mit der etwas schrecklichen Abhilfe steckt so etwas wie tun:

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

Dank für diese Problemumgehung. Wurde dieser Fehler jemals behoben? Ich habe es einfach mit javax.mail '1.4.7' (dem letzten stabilen Build) beschrieben, also rate ich nicht. – nicholas79171

Verwandte Themen