2017-10-23 8 views
0

背景

私は、MS Exchange 2007サーバーからメールを取得するプログラムを実装する予定です。 アーキテクチャの設計上、同じメールボックス&にメールをフェッチするには、複数のスレッド(固定量ではない)を実行して同じメールボックスに接続する必要があります。IMAPStoreとIMAPFolderはJavaMailスレッドセーフですか?

のJavaMail:1.5.6 取引所:2007

問題

各スレッドは、最終的には、電子メールIDを検索して電子メールを取得、電子メールIDを取得し、IMAPStoreを使用して接続し、IMAPFolderを開きます。最後にIMAPFolder & IMAPStoreを閉じます。

プログラムがしばらくの間実行すると、スレッドが増加し、私は例外の下に表示されます:

javax.mail.StoreClosedException: failed to create new store connection 
at com.sun.mail.imap.IMAPFolder.throwClosedException(IMAPFolder.java:3368) 
at com.sun.mail.imap.IMAPFolder.doCommand(IMAPFolder.java:3497) 
at com.sun.mail.imap.IMAPFolder.exists(IMAPFolder.java:560) 
at com.myco.myapp.MessageHandler.getFolder(MessageHandler.java:68) 

私は多分、Exchangeサーバーの接続制限があると思いますので、私は、Exchange管理者に尋ねると、彼は言いましたIMAPStoreによって

  1. 接続:(各メールボックスへ)接続制限はその後、私はテストをした16

    に設定されていますループでは

  2. 、オープンIMAPFolder(と同じフォルダ名)を保つが、

が、私は同じ例外を得た後、15日IMAPFolderを開いて、それらを閉じないと16 1を開こう。私はIMAPFolderのソースコードを読んで、その機能のほとんどを発見した

私の質問は​​です。 1つのグローバルのみを使用することは安全ですかIMAPStore & IMAPFolderオブジェクトは複数のスレッドで共有されますか?

答えて

0

複数のスレッドからIMAPStoreまたはIMAPFolderを使用することは安全ですが、開いている各IMAFolderはサーバへの単一の接続を取得するため、その単一の接続によって同時性が制限されます。各メッセージに対して実行する処理に応じて、単一のスレッドでフォルダを開き、各メッセージに必要なすべての情報を取得し、その情報をスレッドプールに渡して並列処理する方がよい場合があります。

+0

Tks Billは、ExchangeサーバーレベルでIMAPStore.getFolder(folderName)を呼び出すたびに、サーバーへの新しい接続が確立されることを意味しますか? – yellowB

+0

いいえ、Folder.open。 –

関連する問題