JavaMail可能是邪恶的(并迫使您重新启动应用程序服务器)
在配置JavaMail時(shí),總是有一種有趣的方法。 基本上,您必須填寫(xiě)無(wú)類(lèi)型的地圖或?qū)傩越Y(jié)構(gòu),并希望獲得正確的解釋。 網(wǎng)絡(luò)上無(wú)數(shù)的教程顯示了使其正常工作(發(fā)送/接收郵件)所需的最小屬性。
但是,正如我們痛苦地了解到的那樣,您可能需要注意一些鮮為人知的屬性,即套接字IO的超時(shí)設(shè)置。 默認(rèn)情況下,JavaMail對(duì)所有套接字操作(連接,IO等)都使用無(wú)限超時(shí)!
現(xiàn)在,假設(shè)您有一簇SMTP服務(wù)器,它們可以處理通過(guò)DNS循環(huán)訪問(wèn)的傳出郵件。 如果其中一臺(tái)服務(wù)器發(fā)生故障(恰好是JavaMail想要連接的服務(wù)器),則您的郵件發(fā)送線程將永遠(yuǎn)掛起! 這正是發(fā)生在我們身上的事情,我們需要表演一些真正令人討厭的魔術(shù)來(lái)避免悲劇。
因此,我們現(xiàn)在為所有操作設(shè)置超時(shí):
String MAIL_SMTP_CONNECTIONTIMEOUT ="mail.smtp.connectiontimeout";String MAIL_SMTP_TIMEOUT = "mail.smtp.timeout";String MAIL_SMTP_WRITETIMEOUT = "mail.smtp.writetimeout";String MAIL_SOCKET_TIMEOUT = "60000"; // Set a fixed timeout of 60s for all operations - // the default timeout is "infinite"props.put(MAIL_SMTP_CONNECTIONTIMEOUT, MAIL_SOCKET_TIMEOUT);props.put(MAIL_SMTP_TIMEOUT, MAIL_SOCKET_TIMEOUT);props.put(MAIL_SMTP_WRITETIMEOUT, MAIL_SOCKET_TIMEOUT);另外,如果您打算訪問(wèn)基于DNS的循環(huán)服務(wù)(例如Amazon S3)或在我們的示例中的郵件集群,請(qǐng)不要忘記配置Java的DNS緩存tiemout(默認(rèn)情況下也是無(wú)限的):
// Only cache DNS lookups for 10 seconds java.security.Security.setProperty("networkaddress.cache.ttl","10");而且,在我們看來(lái),將所有編碼設(shè)置為UTF-8(獨(dú)立于底層操作系統(tǒng))對(duì)我們來(lái)說(shuō)是一個(gè)好主意,以提供穩(wěn)定的環(huán)境:
System.setProperty("file.encoding", Charsets.UTF_8.name()); System.setProperty("mail.mime.charset", Charsets.UTF_8.name());…您根本不想關(guān)心這樣的事情嗎? 隨意使用我們的開(kāi)源Java庫(kù)SIRIUS ,它通過(guò)提供簡(jiǎn)潔的fluet API發(fā)送郵件來(lái)處理所有這些工作: GitHub上的Sources 。
可以在集群管理器中找到一個(gè)用法示例:
@Partprivate MailService ms;private void alertClusterFailure() {...ms.createEmail().useMailTemplate("system-alert", ctx).toEmail(receiver).send();...}翻譯自: https://www.javacodegeeks.com/2014/06/javamail-can-be-evil-and-force-you-to-restart-your-app-server.html
總結(jié)
以上是生活随笔為你收集整理的JavaMail可能是邪恶的(并迫使您重新启动应用程序服务器)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 您必须学习Java 8的函数式编程吗?
- 下一篇: 为什么要在Java的Serializab