11

次のコードを使用して、電子メールサーバーのフォルダー(「INBOX」)からメッセージを読み取り、それらに対応するメッセージを取得していますが、取得しています

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

いくつかの調査を行ったところ、フォルダーが開くとすぐにメッセージキャッシュがフォルダーに設定されていることがわかりました。520(フォルダーのサイズ)に設定されていると仮定します。一方、メッセージ キャッシュが設定された後にメッセージが到着すると、最後のメッセージ シーケンスで num がメッセージ キャッシュの合計サイズを超え、例外がスローされます。

フォルダー内の最後のメッセージの UId の絶対値を取得する方法、またはキャッシュが設定された後にフォルダーがフォルダーのサイズを更新しないようにフォルダー ロックを取得する方法を教えてください。

4

2 に答える 2

6

面白い問題!

まず、これは javax メールのバグだと思います。おそらく、getMessageBySeqNumber()でcheckRange()呼び出すか、ベクトル サイズを指定して 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);
于 2013-11-13T23:27:46.453 に答える
0

これはおそらく次の Javamail のバグです。

https://java.net/projects/javamail/lists/issues/archive/2010-09/message/1

于 2014-10-21T12:04:43.853 に答える