java - JavaMail 线程安全中的 IMAPStore 和 IMAPFolder 吗?

标签 java multithreading jakarta-mail exchange-server

背景

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

JavaMail:1.5.6 交换:2007年

问题

每个线程都会获取一个email-id并使用IMAPStore进行连接,然后打开一个IMAPFolder,最后通过搜索email-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。

然后我做了一个测试:

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

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

我的问题

我阅读了IMAPFolder的源代码,发现它的大部分功能都是同步的。仅使用一个由多个线程共享的全局 IMAPStoreIMAPFolder 对象是否安全?

最佳答案

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

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

相关文章:

java - 访问阶段变量 - AWS API Gateway

java - WebView 未从 ListView 按钮加载正确的 URL

c++ - 无锁容器如何对并发分区和排序使用react?

java - 错误 - trustAnchors 参数必须非空

java - 如何让javamail支持http代理

java - 使用 Closure-compiler.jar 使用 ANT 进行 r.js 优化时出现非法字符错误

java - 如何查看对象列表以查找匹配项?

javascript - 如何调用另一个线程中的函数

c++ - 如何在 C++ 中创建多线程应用程序

java - org.apache.commons.mail.EmailException : Missing final '@domain' ( by: javax. mail.internet.AddressException:字符串 '@domain' `` 中缺少最后的 1'' )