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。
然后我做了一个测试:
- 通过
IMAPStore
连接
- 在一个循环中,保持打开
IMAPFolder
(具有相同的文件夹名称)但不关闭它们
然后我在打开第 15 个后遇到了同样的异常 IMAPFolder
并尝试打开第 16 个。
我的问题
我看过IMAPFolder的源代码,发现它的大部分功能都是synchronized
。仅使用一个由多个线程共享的全局 IMAPStore
& IMAPFolder
对象是否安全?
从多个线程使用 IMAPStore 或 IMAPFolder 是安全的,但每个打开的 IMAFolder 都会获得到服务器的单个连接,因此您的并发性将受到该单个连接的限制。根据您对每条消息所做的处理,最好让一个线程打开文件夹并获取每条消息所需的所有信息,然后将该信息传递给线程池以并行处理。
背景
我要实现一个从 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。
然后我做了一个测试:
- 通过
IMAPStore
连接
- 在一个循环中,保持打开
IMAPFolder
(具有相同的文件夹名称)但不关闭它们
然后我在打开第 15 个后遇到了同样的异常 IMAPFolder
并尝试打开第 16 个。
我的问题
我看过IMAPFolder的源代码,发现它的大部分功能都是synchronized
。仅使用一个由多个线程共享的全局 IMAPStore
& IMAPFolder
对象是否安全?
从多个线程使用 IMAPStore 或 IMAPFolder 是安全的,但每个打开的 IMAFolder 都会获得到服务器的单个连接,因此您的并发性将受到该单个连接的限制。根据您对每条消息所做的处理,最好让一个线程打开文件夹并获取每条消息所需的所有信息,然后将该信息传递给线程池以并行处理。