2012-10-26 17 views
10

मैं emailServer से ईमेल पढ़ रहा हूँ और उन्हें database.I में बचत निम्नलिखित कोड का उपयोग कर रहा फ़ोल्डर से संदेशों को पढ़ने ईमेल सर्वर पर ("इनबॉक्स") और उन्हें करने के लिए इसी संदेशों लेकिन मैं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 (फ़ोल्डर का आकार) निर्धारित है। जबकि संदेश कैश सेट होने के बाद कोई संदेश आता है, तो अंतिम संदेश अनुक्रम संख्या में संदेश कैश के कुल आकार से अधिक है और यह एक अपवाद फेंकता है।

क्या कोई मुझे बता सकता है कि फ़ोल्डर में अंतिम संदेश के यूआईडी का पूर्ण मूल्य कैसे प्राप्त करें या फ़ोल्डर लॉक कैसे प्राप्त करें ताकि कैश सेट होने के बाद, फ़ोल्डर फ़ोल्डर के आकार को अपडेट नहीं करता है।

उत्तर

4

दिलचस्प बात नहीं!

सबसे पहले, मुझे लगता है कि इस javax मेल में एक बग है। शायद getMessageBySeqNumber() में checkRange() के लिए एक कॉल किया जाना चाहिए, या बस वेक्टर आकार के साथ एक Math.min()

किसी भी मामले में, मुद्दा यह है कि कोड सर्वर को जाता है नवीनतम संदेश गणना प्राप्त करने के लिए है, लेकिन कभी अद्यतन करता है स्थानीय 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

संबंधित मुद्दे