将邮件会话(javax.mail.Session)存储在单例中是一种很好的做法吗?我和我的团队决定在Singleton类中的一个静态变量中保留一个邮件会话。
所以,在私有构造函数中我们这样做:
try {
Properties props = new Properties();
props.put("mail.transport.protocol", config.getMailTransportProtocol());
props.put("mail.smtp.starttls.enable", config.getMailStarttlsEnable());
props.put("mail.smtp.host", config.getMailHost());
props.put("mail.smtp.auth", config.getMailAuth());
props.put("mail.smtp.user", config.getMailFrom());
props.put("mail.debug", config.getMailDebug());
props.put("mail.smtp.port", config.getMailPort());
props.put("mail.smtp.socketFactory.port", config.getMailPort());
props.put("mail.smtp.socketFactory.class", config.getMailSocketFactoryClass());
props.put("mail.smtp.socketFactory.fallback", config.getMailSocketFactoryFallback());
props.put("mail.pop3.host", config.getMailPop3Host());
props.put("mail.store.protocol", config.getMailStoreProtocol());
SimpleAuth auth = new SimpleAuth(config.getMailUser(), config.getMailPass());
MailSession.session = Session.getDefaultInstance(props, auth);
session.setDebug(config.getMailDebug());
} catch (Throwable ex) {
System.err.println("Initial MailSession creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
但我担心最好是保持这样,还是打开和关闭每封电子邮件的会话。
答案 0 :(得分:6)
首先,您希望在common mistakes上阅读此JavaMail FAQ条目。
如果你阅读javadocs for the Session.getDefaultInstance method,你会发现JavaMail已经为你维护了一个单独的会话。如果您永远不会更改会话的配置,这可能对您有用,但我通常建议不要这样做。
答案 1 :(得分:0)
我宁愿不去寻找这个解决方案,因为在线程之间共享一个可变对象可能很麻烦。考虑实施一个邮件会话工厂,您可以从中获取准备好配置的会话。这并不意味着为每封邮件使用一个新会话:如果您要发送批量邮件,可以重复使用同一会话发送批量邮件。