27

我正在研究 Javamail 是否是线程安全的,特别是在有许多会话对应于不同用户、多个 SMTP 服务器以及创建 MIME 消息和使用transport.sendMessage方法的情况下。我知道 Javamail 是面向桌面使用的,这让我怀疑它在构建时可能没有考虑到线程,我想知道是否有人有这样的经验。

4

2 回答 2

73

诚然,JavaMail 的线程安全规则没有很好的文档记录,但希望它们大部分符合您的预期。

多个线程可以使用一个 Session。

由于 Transport 表示与邮件服务器的连接,并且一次只有一个线程可以使用该连接,因此 Transport 将同步来自多个线程的访问以维护线程安全,但您实际上只想从单个线程中使用它线。

类似地,一个 Store 可以被多个线程使用,但是对底层连接的访问​​将是同步的并且是单线程的。

一条消息一次只能由一个线程修改,但多个线程应该能够安全地读取一条消息(尽管不清楚为什么要这样做)。

希望有帮助...

于 2012-10-04T18:16:17.503 回答
2

如果服务器没有及时响应,javamail 调度程序线程似乎不会超时。这会导致锁定所有可用线程。

用 1.4.3 和 1.4.5 测试了这种行为。

于 2012-10-08T07:43:28.583 回答