如何在应用程序的所有实例之间共享相同的电子邮件会话?

时间:2015-06-16 13:29:29

标签: java session java-ee javamail

也许这个问题已经回答了,但我找不到合适的答案。 我有一个基于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);

然后我继续在队列中发送消息,但我正在寻找一种方法来设置该连接,然后在必要时开始在队列中发送邮件。

1 个答案:

答案 0 :(得分:1)

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获取Session实例。这在上面链接的文档中有描述。