JavaMail线程安全中的IMAPStore和IMAPFolder?

Is IMAPStore and IMAPFolder in JavaMail Thread Safety?

背景

我要实现一个从 MS Exchange 2007 服务器获取邮件的程序。 由于架构设计,我必须运行多个线程(不固定数量)连接到同一个邮箱和同一个文件夹来获取邮件。

Java邮件:1.5.6 交换:2007

问题

每个线程都会得到一个email-id 并使用IMAPStore 连接,然后打开一个IMAPFolder,最后通过搜索email-id 来获取电子邮件。最后关闭 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 管理员,他说连接限制(到每个邮箱)设置为 16。

然后我做了一个测试:

  1. 通过 IMAPStore
  2. 连接
  3. 在一个循环中,保持打开 IMAPFolder(具有相同的文件夹名称)但不关闭它们

然后我在打开第 15 个后遇到了同样的异常 IMAPFolder 并尝试打开第 16 个。

我的问题

我看过IMAPFolder的源代码,发现它的大部分功能都是synchronized。仅使用一个由多个线程共享的全局 IMAPStore & IMAPFolder 对象是否安全?

从多个线程使用 IMAPStore 或 IMAPFolder 是安全的,但每个打开的 IMAFolder 都会获得到服务器的单个连接,因此您的并发性将受到该单个连接的限制。根据您对每条消息所做的处理,最好让一个线程打开文件夹并获取每条消息所需的所有信息,然后将该信息传递给线程池以并行处理。