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(...)

存在する場合、サーバーは 1 回の要求でフォルダーを作成しますが、メッセージのコピーを処理するサーバー コードの部分にこの作成が到達するまでに時間がかかります。残念ながら、コピーが失敗した場合や人為的な遅延 (最悪) の場合に再試行する以外に、できることがたくさんあるかどうかはわかりません。

余談: ドキュメントには、必要に応じてスキップできると書かれているdest.open(Folder.READ_WRITE);ようです。

于 2013-02-11T03:08:49.727 に答える