2012-10-26 16 views
10

Sto leggendo le email da emailServer e salvandole nel database. Sto usando il seguente codice per leggere i messaggi dalla cartella ("inbox") sul server di posta elettronica e ricevere messaggi corrispondenti a loro, ma io sono semprejava.lang.ArrayIndexOutOfBoundsException t a 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)" 

sto usando javax.mail.1.4.4, questo problema è venuta soprattutto quando casella di posta è sempre allagata.

codice utilizzato:

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

ho fatto qualche ricerca e ha scoperto che messagecache è impostato per una cartella non appena si apre, lascia supporre che è impostato come 520 (dimensione della cartella). Mentre se arriva un messaggio dopo aver impostato la cache dei messaggi, nell'ultima sequenza di messaggi num supera la dimensione totale della cache dei messaggi e genera un'eccezione.

Qualcuno può farmi sapere come ottenere il valore assoluto di UId dell'ultimo messaggio in una cartella o come acquisire un blocco di cartella in modo che dopo aver impostato la cache, la cartella non aggiorna la dimensione della cartella.

risposta

4

Interessante problema!

In primo luogo, penso che questo sia un bug nella posta javax. Ci dovrebbe probabilmente essere una chiamata a checkRange() in getMessageBySeqNumber(), o solo un Math.min() con le dimensioni del vettore.

In ogni caso, il problema è che il codice va al server per ottenere il conteggio dei messaggi più recente, ma non aggiorna mai il messaggio messageCache locale. Ciò significa che messageCache ha dati non aggiornati rispetto al metodo, tuttavia il metodo presuppone comunque che sia aggiornato ... come si è visto assicura l'ilarità.

Ora, come evitarlo fino a quando non viene risolto?

Purtroppo, penso che si è bloccato con la soluzione in qualche modo orribile di fare qualcosa di simile:

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

Grazie per questa soluzione. Questo bug è mai stato corretto? Mi sono imbattuto in javax.mail '1.4.7' (l'ultima build stabile), quindi non sto indovinando. – nicholas79171