我将实现一个从MS Exchange 2007服务器获取邮件的程序。 由于架构设计,我必须运行多个线程(非固定数量)才能连接到同一个邮箱和用于获取邮件的相同文件夹。
JavaMail:1.5.6 交流:2007
每个帖子都会获得一个电子邮件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
对象?
答案 0 :(得分:0)
从多个线程使用IMAPStore或IMAPFolder是安全的,但每个打开的IMAFolder都会获得与服务器的单一连接,因此您的并发性将受到该单个连接的限制。根据您对每条消息所执行的处理,最好让单个线程打开文件夹并获取每条消息所需的所有信息,并将该信息传递给线程池以并行处理。