背景
我将实现一个程序来从 MS Exchange 2007 服务器获取邮件。 由于架构设计,我必须运行多个线程(不固定数量)来连接到相同的邮箱和相同的文件夹来获取邮件。
JavaMail: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。
然后我做了一个测试:
- 通过
IMAPStore
连接 - 在循环中,保持打开
IMAPFolder
(具有相同的文件夹名称)但不要关闭它们
然后,在打开第 15 个 IMAPFolder
并尝试打开第 16 个 IMAPFolder 后,我遇到了相同的异常。
我的问题
我阅读了IMAPFolder的源代码,发现它的大部分功能都是同步
的。仅使用一个由多个线程共享的全局 IMAPStore
和 IMAPFolder
对象是否安全?
最佳答案
从多个线程使用 IMAPStore 或 IMAPFolder 是安全的,但每个打开的 IMAFolder 都会获得到服务器的单个连接,因此您的并发性将受到该单个连接的限制。根据您对每条消息进行的处理,最好让单个线程打开文件夹并获取每条消息所需的所有信息,并将该信息传递到线程池以并行处理。
关于java - JavaMail 线程安全中的 IMAPStore 和 IMAPFolder 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46892347/