如何在应用程序的所有实例之间共享相同的电子邮件会话?
How to share the same email session between all instances of the application?
也许这个问题已经有了答案,但我找不到合适的答案。
我有一个基于 JSF 的 Web 应用程序,我想在应用程序的所有实例之间共享相同的电子邮件会话,但我还没有找到如何做到这一点。
我的问题是:
a) 我在想什么是愚蠢的?我是否应该在每次发送新邮件时都创建一个新会话?
b) 如果 a 为假,有正确的方法吗?
其他信息:我正在使用 PrimeFaces 4.0、Apache Tomcat 7.0.41 和 JDK 7.
编辑: 我正在建立这样的电子邮件连接(使用 sun 的 java 邮件)
Properties datos = new Properties();
datos.put("mail.smtp.host", "smtp.gmail.com");
datos.setProperty("mail.smtp.starttls.enable", "true");
datos.setProperty("mail.smtp.port", "587");
datos.setProperty("mail.smtp.user", usuarioAutenticacion);
datos.put("mail.smtp.timeout", 5000);
System.out.println(usuarioAutenticacion + " - " + contrasenaAutenticacion);
sesionCorreo = Session.getDefaultInstance(datos, null);
sesionCorreo.setDebug(true);
try {
conexionCorreo = sesionCorreo.getTransport("smtp");
} catch (NoSuchProviderException ex) {
Logger.getLogger(NotificacionesManager.class.getName()).log(Level.SEVERE, null, ex);
}
try {
conexionCorreo.connect(usuarioAutenticacion, contrasenaAutenticacion);
然后我继续发送队列中的邮件,但我正在寻找一种方法,只需设置一次该连接,然后在必要时开始发送队列中的邮件。
Java EE 设计者希望您执行此操作的方式是您在服务器中配置 javax.mail.Session 对象。 Tomcat 7 JavaMail Sessions 文档中对此进行了描述。
然后您的托管 bean 应该能够通过@Resource 访问会话:
class MyManagedBean {
@Resource(name="mail/Session") // this name is defined by your configuration
private Session mailSession;
public void someBusinessMethod() {
...
Message message = new MimeMessage(mailSession);
// compose message
...
Transport.send(message);
}
}
如果您需要从非托管 bean 执行此操作,那么您可以使用 JNDI 获取会话实例。这在上面链接的文档中有描述。
也许这个问题已经有了答案,但我找不到合适的答案。 我有一个基于 JSF 的 Web 应用程序,我想在应用程序的所有实例之间共享相同的电子邮件会话,但我还没有找到如何做到这一点。
我的问题是:
a) 我在想什么是愚蠢的?我是否应该在每次发送新邮件时都创建一个新会话?
b) 如果 a 为假,有正确的方法吗?
其他信息:我正在使用 PrimeFaces 4.0、Apache Tomcat 7.0.41 和 JDK 7.
编辑: 我正在建立这样的电子邮件连接(使用 sun 的 java 邮件)
Properties datos = new Properties();
datos.put("mail.smtp.host", "smtp.gmail.com");
datos.setProperty("mail.smtp.starttls.enable", "true");
datos.setProperty("mail.smtp.port", "587");
datos.setProperty("mail.smtp.user", usuarioAutenticacion);
datos.put("mail.smtp.timeout", 5000);
System.out.println(usuarioAutenticacion + " - " + contrasenaAutenticacion);
sesionCorreo = Session.getDefaultInstance(datos, null);
sesionCorreo.setDebug(true);
try {
conexionCorreo = sesionCorreo.getTransport("smtp");
} catch (NoSuchProviderException ex) {
Logger.getLogger(NotificacionesManager.class.getName()).log(Level.SEVERE, null, ex);
}
try {
conexionCorreo.connect(usuarioAutenticacion, contrasenaAutenticacion);
然后我继续发送队列中的邮件,但我正在寻找一种方法,只需设置一次该连接,然后在必要时开始发送队列中的邮件。
Java EE 设计者希望您执行此操作的方式是您在服务器中配置 javax.mail.Session 对象。 Tomcat 7 JavaMail Sessions 文档中对此进行了描述。
然后您的托管 bean 应该能够通过@Resource 访问会话:
class MyManagedBean {
@Resource(name="mail/Session") // this name is defined by your configuration
private Session mailSession;
public void someBusinessMethod() {
...
Message message = new MimeMessage(mailSession);
// compose message
...
Transport.send(message);
}
}
如果您需要从非托管 bean 执行此操作,那么您可以使用 JNDI 获取会话实例。这在上面链接的文档中有描述。