Spring JavaMailSender - 使用会话的最佳方式

问题描述:

在Spring JavaMailSender中重用会话的最佳方式是什么?Spring JavaMailSender - 使用会话的最佳方式

在消费者从队列中读取消息并根据消息触发电子邮件的情况下,电子邮件将会一个接一个地发送。如果每次都创建一个新的会话,是不是一个开销?如果JavaMailSender是单身bean,它是否总是使用相同的会话?这里最好的解决方案是什么?

我看到JNDI会话的样本被设置为JavaMailSender bean配置。我们不支持JNDI,所以这不是一个选项。

如果您使用MailSendingMessageHandler的标准JavaMailSender,那么您只需重新使用Session

// Check transport connection first... 
if (transport == null || !transport.isConnected()) { 
... 
try { 
    transport = connectTransport(); 
} 

... 

Transport transport = getTransport(getSession()); 
transport.connect(getHost(), getPort(), username, password); 
return transport; 

... 

public synchronized Session getSession() { 
    if (this.session == null) { 
     this.session = Session.getInstance(this.javaMailProperties); 
    } 
    return this.session; 
} 

不知道从那里你听到一个新的会话是为每个消息创建...

+0

我目前正在创建JavaMailSenderImpl的新实例,因此新的会话。即使消息是从队列中读取的,邮件发送部分也不会与弹簧集成集成。它是一个使用JavaMailSenderImpl和MimeMessageHelper的独立组件,可以从应用程序中的任何位置调用它来发送邮件。如果我们将它转​​换为一个bean,并在整个过程中使用它,会话如何工作?在任何时间点发送的邮件是否都使用同一会话? –

+1

是的,'JavaMailSender'必须是单身bean,其会话将被重用。前一次死亡时只有新的会话。 Session是一个线程安全的对象,所以它可以被共享。完全不用担心! –