java - 提高通过 spring-mail 发送批量电子邮件的性能

标签 java spring performance email bulk

我有一个 spring 独立应用程序,它使用简单的 spring 电子邮件代码,如下所示,tomessage 是使用从映射迭代的值构造的。

我已经对问题 here 提出了一些建议,但我需要一些具体的建议。下面是我的代码

for (Map.Entry<String, List<values>> entry : testMap
                .entrySet()) {
            String key = entry.getKey();
            StringBuilder htmlBuilder = new StringBuilder();            
            List<Model> valueList = entry.getValue();
            for (Model value : valueList) {
                htmlBuilder.append('List Values in the message');
            }
            mail.sendMail( msgFrom,body); // call my sendMail function in another class
        } 

发送邮件的代码:

        MimeMessage email = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(email, true);
        helper.setFrom(new InternetAddress(from));
        helper.setTo(new InternetAddress(to));
        helper.setText(msg, true);
        helper.addInline("identifier1234", res);
        mailSender.send(email);

发送邮件需要3到4秒。我每天有大约 400,000 个用户列表需要发送

我是否做了任何错误或任何其他方法来加快这个过程。我需要专家建议

感谢您的时间和帮助:)

最佳答案

恕我直言,发送邮件的过程本身可以改进,因为目前,您为每条消息打开一个到邮件服务器的新连接。您可以通过使用批量发送来改进它。

Spring MailSender 接口(interface)本身支持发送一组消息而不是单个消息,因此您不必显式处理 JavaMail Session。您可以简单地修改实际以这种方式发送邮件的类

int batchSize = 16; // for example, adjust it to you needs
MimeMessage[] messages = new MimeMessage[batchSize];
int messageIndex = 0;

public void sendMail(String msgFrom, String body) {
    // prepare MimeMessage
    messages[messageIndex++] = email;
    if (messagesIndex == batchSize) {
        mailSender.send(messages);
        messageIndex = 0;
    }

public void sendLastMails() {
    if (messageIndex > 0) {
        MimeMessage[] lastMessages = new MimeMessage[messageIndex];
        for (int i =0; i<messageIndex; i++) {
            lastMessages[i] = messages[i];
    }
    mailSender.send(lastMessages);
}

编辑:

sendLastMails 方法可以在多个地方调用。首先,必须在单例 bean 的 destroy 方法中调用它,以确保应用程序关闭时不会忘记任何消息。如果发送邮件的类是单例 bean,则只需声明该 bean 的 destroy 方法为 sendLastMail 或调用它即可。

然后根据你自己的业务规则,可能会在发送一批邮件后调用。典型用法:在您的示例中,您有 testMap。你应该这样重写:

    for (Map.Entry<String, List<values>> entry : testMap
            .entrySet()) {
        ...
        mail.sendMail( msgFrom,body); // call my sendMail function in another class
    }
    mail.sendLastMails();

现在由您来决定这种改进是否足够或者是否应该外包。

关于java - 提高通过 spring-mail 发送批量电子邮件的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26231165/

相关文章:

java - 如何使自动完成接受多个值?

java - 如何将 RTMP 流重定向到客户端

java - 没有 Spring Security ACL 的 Spring 对象级权限

java - 帕斯卡三角算法的时间复杂度是多少

java - 为 JTable 构建并发 TableColumnAdjuster

java - 二分查找平方根[作业]

spring - ModelAndView object.addAttribute() 相当于 request.setAttribute

android - JSON文件VS SQLite android

java - 使用流从 HashSet 中排除极值

java - 如何在同一个java webapp上使用不同的子域