2013-02-11 60 views
0

我想創建一個文件夾,如果它不存在,然後從另一個文件夾複製消息到目標文件夾。我發現了一些我無法理解的奇怪行爲。鑑於以下摘錄:爲什麼成功創建文件夾後會出現FolderNotFoundException?

// messages is an array of Message instances. 
// Source is the source folder 
// destination is a string of the destination folder. 
Folder dest = null; 
try { 
    dest = store.getFolder(destination); 
    if (!dest.exists()) { 
     dest.create(Folder.HOLDS_MESSAGES | Folder.HOLDS_FOLDERS); 
     // Since folder's are not meant to cache I thought I'd get it again 
     // though this does not work either. 
     //dest.close(false); 
     //dest = store.getFolder(destination); 
    } 
    dest.open(Folder.READ_WRITE); 
    // Fails here 
    source.copyMessages(messages, dest); 
    source.setFlags(messages, new Flags(Flags.Flag.DELETED), true); 
} catch (MessagingException ex) { 
    throw new MailProcessorException(ex.getMessage(), ex); 
} finally { 
    if (dest != null) { 
     try { 
      dest.close(false); 
     } catch (MessagingException ex) { 
      System.err.println("Couldn't close destination folder."); 
     } 
    } 
} 

以下行爲被檢查:

  • 如果該文件夾不存在:
    1. 該文件夾被創建
    2. 一個例外是在source.copyMessages拋出。
  • 如果該文件夾確實存在:
    1. 這些消息如預期被複制。
    2. 消息標記爲刪除。
我使用JavaMail 1.4.6

,也試圖與1.6.5。

+0

在創建文件夾後嘗試將if(!dest.exists())'改爲'while(!dest.exists())'並添加Thread.sleep(1000)' – goravine 2013-02-11 02:40:44

+0

否這不起作用。我之前在'create()'後面加了一個調試語句來輸出'dest.exists()',它總是會輸出'true'。 – 2013-02-11 03:04:42

回答

1

這是真的奇怪。看着你的代碼和讀取文檔,應該沒有辦法,這是發生...

難道是一些問題與郵件服務器?有些數據庫使用一致性模型(例如,參見http://en.wikipedia.org/wiki/Eventual_consistency),這些模型並不總是按照您的天真想法行事。是否有機會在不同的郵件服務器上嘗試您的代碼?或者,嘗試在copyMessages(...)呼叫之前放置一段非常長的(30秒?)Thread.sleep(...),然後查看是否修復了該問題。

如果是的話,所發生的事情是,你的服務器在一個請求中創建文件夾,但這種創作需要一段時間才能達到這個被處理消息的複製服務器代碼的一部分。然後,不幸的是,如果複製失敗或人工延遲(這很糟糕),我不確定是否有很多事情可以做,而不是重試。

另外:文檔似乎說,如果你喜歡,你可以跳過dest.open(Folder.READ_WRITE);

+0

Markas似乎正是發生了什麼。我將文件夾創建後的延遲設置爲10秒,然後; 'copyMessages()'傳遞並按預期行爲。我正在連接交流2007年,我可以嘗試對像GMail這樣的測試,儘管當我有一點空閒時間時我需要對此進行調查。我認爲解決辦法是使用一個小的延遲與重試限制相結合,如果失敗,可以再次嘗試幾次。這需要完成這是一個痛苦,但我想它需要完成:)非常感謝你的幫助Markus。 – 2013-02-11 03:59:32

+1

:)很高興我能幫忙!交換,ey?去M $!讓我們的生活更容易一次一個bug ... – 2013-02-11 04:02:21

+1

哈哈,謝謝:)我已經提出了[JavaMail bug 5822](http://kenai.com/bugzilla/post_bug.cgi),看看是否可以解決這個問題由甲骨文,不確定的機會,但它是值得一試,如果只是幫助其他毫無戒心的受害者。在協議級別返回成功/失敗之前,Oracle可能會檢查某些內容,而不是發生哈希延遲等。 – 2013-02-11 04:14:39

相關問題