2013-02-11 72 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

相关问题