背景
我将实现一个程序,以从MS Exchange 2007服务器获取邮件。
由于体系结构设计,我必须运行多个线程(不固定数量)以连接到同一邮箱和同一文件夹以获取邮件。
JavaMail:1.5.6
交换:2007
问题
每个线程都将获得一个电子邮件ID,并使用IMAPStore
进行连接,然后打开一个IMAPFolder
,最后通过搜索电子邮件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。
然后我做了一个测试:
通过
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/