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;
}
不知道从那里你听到一个新的会话是为每个消息创建...
我目前正在创建JavaMailSenderImpl的新实例,因此新的会话。即使消息是从队列中读取的,邮件发送部分也不会与弹簧集成集成。它是一个使用JavaMailSenderImpl和MimeMessageHelper的独立组件,可以从应用程序中的任何位置调用它来发送邮件。如果我们将它转换为一个bean,并在整个过程中使用它,会话如何工作?在任何时间点发送的邮件是否都使用同一会话? –
是的,'JavaMailSender'必须是单身bean,其会话将被重用。前一次死亡时只有新的会话。 Session是一个线程安全的对象,所以它可以被共享。完全不用担心! –