0

如果文件夹不存在,我正在尝试创建一个文件夹,然后将消息从另一个文件夹复制到目标文件夹。我发现一些我无法理解的奇怪行为。鉴于以下摘录:

// 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。

4

1 回答 1

1

真的很奇怪。查看您的代码并阅读文档,应该不可能发生这种情况......

会不会是邮件服务器有问题?一些数据库使用的一致性模型(例如,参见http://en.wikipedia.org/wiki/Eventual_consistency)并不总是按照您天真期望的方式运行。您是否有机会在不同的邮件服务器上尝试您的代码?Thread.sleep(...)或者,试着在你的电话之前放一个很长的时间(30 秒?)copyMessages(...),看看是否能解决问题。

如果是这样,则发生的情况是您的服务器在一个请求中创建了该文件夹,但是这种创建需要一段时间才能到达处理消息复制的服务器代码部分。然后,不幸的是,如果复制失败或人为延迟(这很糟糕),我不确定除了重试之外你还能做些什么。

旁白:文档似乎说,dest.open(Folder.READ_WRITE);如果你愿意,你可以跳过.

于 2013-02-11T03:08:49.727 回答