我正在编写一个系统,一旦将工作分配给用户,该系统就会向用户发送电子邮件通知。
正如您可以想象的那样,“建立与邮件服务器的连接”是昂贵的。
我想要一种重用相同连接的方法。问题是邮件服务器在某些时候会“终止”连接(由于不活动等)。
此外,我不想每次发送电子邮件时都创建 Session
对象...应使用相同的 session 对象。
这是我的 EJB 方法的样子:
@Asynchronous
public Future<String> sendEmail(String email) {
.....
//I want to reuse the same session object. What if another
//application runs in the same JVM and creates the session
//object before mine? My properties will be ignored? Probably Yes.
Session session = Session.getDefaultInstance(props);
try{
// Instantiate a message
Message msg = new MimeMessage(session);
.....
//This will create and close the connection each time...
Transport.send(msg);
}
finally{....}
}
最佳答案
您可以重用 Session 对象,但您需要找出应用程序中创建它并存储它以供重用的最佳位置。
传输对象也是如此,但正如您所指出的,您的应用程序必须处理这样一个事实:如果您不对其进行任何操作,邮件服务器不希望您保持连接打开,因此将关闭连接。当您检测到此情况时,需要重新连接。
如果您要发送大量电子邮件,您可能希望将所有通知请求发送到单独的线程或任务或其他内容,然后从那里发送电子邮件。您可能希望批量通知并每天、每小时、每分钟或任何适合您的应用程序的时间发送出去。
如您所见,没有一种最佳实践可以处理所有这些问题。这在很大程度上取决于您的应用程序的需求。
关于Java Mail - 创建电子邮件通知系统的最佳实践/有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30305905/