2012-10-26 2 views
10

전자 메일 서버에서 전자 메일을 읽고 데이터베이스에 저장하고 있습니다. 다음 코드를 사용하여 폴더에서 메시지를 읽습니다. 받은 편지함이 범람하기 때 이메일 서버 ("INBOX") 메시지가 그들에 해당하지만 난 javax.mail.1.4.4을 사용하고java.lang.ArrayIndexOutOfBoundsException t at 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)" 

무엇입니까 검색이 문제는 주로오고있다. 사용

코드 :

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 (폴더의 크기)로 설정된다고 가정 할 수 있습니다. 반면 메시지 캐시가 설정된 후 메시지가 도착하면 마지막 메시지 시퀀스 num은 메시지 캐시의 전체 크기를 초과하며 예외가 발생합니다.

아무도 나에게 폴더의 마지막 메시지 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