gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:01:00 25 4
gpt4 key购买 nike

背景

我将实现一个程序来从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com