ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-03 12:19:42  阅读:319  来源: 互联网

标签:bulk java performance spring email


我有一个独立于spring-stand的应用程序,它使用如下的简单弹簧电子邮件代码,to和消息是使用从map迭代的值构造的.

我已经对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接口本身支持发送一组消息而不是一个消息,因此您没有明确地处理JavaMail会话.您可以简单地修改实际以这种方式发送邮件的类

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();

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

标签:bulk,java,performance,spring,email
来源: https://codeday.me/bug/20191003/1849302.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有