【问题标题】:Spring JavaMailSender - best way to use sessionSpring JavaMailSender - 使用会话的最佳方式
【发布时间】:2016-08-20 09:07:38
【问题描述】:

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

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

我看到在 JavaMailSender bean 配置中设置了 JNDI 会话示例。我们不支持 JNDI,所以这不是一个选项。

【问题讨论】:

    标签: spring spring-integration mail-server


    【解决方案1】:

    如果您将标准JavaMailSender 用于MailSendingMessageHandler,那么您只需重用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 的新实例,因此是新会话。即使从队列中读取消息,邮件发送部分也没有与 spring 集成集成。它是一个使用 JavaMailSenderImpl 和 MimeMessageHelper 的独立组件,可以从应用程序中的任何位置调用它来发送邮件。如果我们将它转​​换成一个 bean,并在其中使用它,那么 session 是如何工作的?在任何时间点发送的邮件是否使用相同的会话?
    • 是的,JavaMailSender 必须是单例 bean,它的会话将被重用。当前一个会话死亡时,只会获得一个新会话。 Session是线程安全的对象,所以可以共享。没什么好担心的!
    猜你喜欢
    • 2014-12-24
    • 2010-09-15
    • 1970-01-01
    • 2016-10-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    相关资源
    最近更新 更多