Javamail 中的线程安全
Posted
技术标签:
【中文标题】Javamail 中的线程安全【英文标题】:Threadsafety in Javamail 【发布时间】:2012-09-25 19:16:26 【问题描述】:我正在研究 Javamail 是否是线程安全的,特别是在有许多会话对应不同用户、多个 SMTP 服务器以及使用创建 MIME 消息和使用transport.sendMessage
方法的情况下。我知道 Javamail 是面向桌面使用的,这让我怀疑它在构建时可能没有考虑到线程,我想知道是否有人有这样的经验。
【问题讨论】:
【参考方案1】:诚然,JavaMail 的线程安全规则没有很好的文档记录,但希望它们大多符合您的预期。
多个线程可以使用一个 Session。
由于 Transport 表示与邮件服务器的连接,并且一次只能有一个线程使用该连接,Transport 将同步来自多个线程的访问以维护线程安全,但您真的只想使用它来自一个线程。
同样,一个Store可以被多个线程使用,但是对底层连接的访问将是同步的并且是单线程的。
一条消息一次只能由一个线程修改,但多个线程应该能够安全地读取一条消息(尽管不清楚为什么要这样做)。
希望对您有所帮助...
【讨论】:
您是从 javadoc、来源、经验中学到的吗? 赞!由于没有参考支持你的解释,我想知道你怎么能如此自信。现在我明白了;)显然,+1! 很高兴您回答这么多JavaMail 问题而不关心声誉。你是真正的无名英雄! @BillShannon - 这是否意味着使用多个线程将消息从一个存储复制到另一个存储与在单个线程中这样做相比没有性能优势?谢谢! 视情况而定。每个打开的文件夹都使用一个连接,并且连接上的操作必须是单线程的。您可以多次打开该文件夹;这是否有帮助将取决于服务器。当然,如果您在多个文件夹上进行操作,那么使用多个线程可能会有所帮助。【参考方案2】:如果服务器没有及时响应,javamail 调度程序线程似乎不会超时。这会导致锁定所有可用线程。
用 1.4.3 和 1.4.5 测试了这种行为。
【讨论】:
以上是关于Javamail 中的线程安全的主要内容,如果未能解决你的问题,请参考以下文章