2012-10-26 11 views
10

emailServerから電子メールを読み込んでデータベースに保存しています。次のコードを使用して、フォルダからメッセージを読み取ります(「INBOX」)電子メールサーバー上とそれに対応するメッセージを取得私はjava.lang.ArrayIndexOutOfBoundsException t 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(フォルダのサイズ)として設定されていると仮定することができます。一方、メッセージキャッシュが設定された後にメッセージが到着した場合、最後のメッセージシーケンス番号はメッセージキャッシュの合計サイズを超え、例外をスローします。

最後のメッセージのUIdの絶対値を取得する方法や、キャッシュの設定後にフォルダのサイズを更新しないようにフォルダロックを取得する方法を教えてもらえますか?

答えて

4

面白い問題!

まず、これはjavaxメールのバグだと思います。おそらくcheckRange()への呼び出しがgetMessageBySeqNumber()にあるか、またはベクトルサイズのMath.min()にあるはずです。

いずれの場合でも、コードは最新のメッセージ数を取得するためにサーバーに送られますが、ローカルのmessageCacheは更新されません。これは、メソッドと比較してmessageCacheのデータが古くなっていることを意味しますが、このメソッドは最新のものであると仮定しています。

ここまでは、修正するまで回避する方法はありますか?

は残念ながら、私はあなたが同じような何かをすることのやや恐ろしい回避策で立ち往生していると思います:

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

感謝。このバグは修正されましたか?私はちょうどjavax.mail '1.4.7'(最新の安定版ビルド)を使用していましたので、私は推測していません。 – nicholas79171

関連する問題