背景

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

JavaMail:1.5.6
交换:2007

问题

每个线程都将获得一个电子邮件ID,并使用IMAPStore进行连接,然后打开一个IMAPFolder,最后通过搜索电子邮件ID来获取电子邮件。最后关闭IMAPFolderIMAPStore

当程序运行一段时间后,线程数增加,我将得到以下异常:

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。

然后我做了一个测试:


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


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

我的问题

我已经阅读了IMAPFolder的源代码,发现它的大多数功能是IMAPStore。仅使用一个由多个线程共享的全局IMAPFolder和对象是否安全?

最佳答案

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

关于java - JavaMail Thread Safety中的IMAPStore和IMAPFolder是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46892347/

10-12 02:16