我正在编写一个系统,一旦为其分配了工作,就会向用户发送电子邮件通知。
您可以想象"建立与邮件服务器的连接"很贵。
我想要一种重用相同连接的方法。问题是邮件服务器在某些时候会" kill "连接(因为不活动等)。
此外,每次发送电子邮件时,我都不想创建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{....}
}
答案 0 :(得分:0)
您可以重复使用Session对象,但是您需要找出应用程序中创建它并存储它以供重用的最佳位置。
同样是Transport对象,但是当你指出你的应用程序将不得不处理这样一个事实:如果你没有对它做任何事情,邮件服务器不希望你保持连接打开,因此将关闭连接。当您检测到此情况时,您需要重新连接。
如果您要发送大量电子邮件,您可能希望将所有通知请求发送到单独的线程或任务或其他任何内容,并从那里发送电子邮件。您可能希望批量处理通知并将其发送到每天,每小时或每分钟或适合您的应用程序。
正如您所看到的,处理所有这些问题没有一种最佳做法。这很大程度上取决于您的应用程序的需求。