Spring has implementation for concurrency tasks based on java concurrency. Next I will create mail sending service (JavaMailSender - extended MailSender interface for JavaMail) task executor


package com.test.service;

import java.io.File;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.task.TaskExecutor;
import org.springframework.mail.MailParseException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

@Service("mailService")
public class MailService {
@Autowired
private JavaMailSender mailSender;

@Autowired
private TaskExecutor taskExecutor;

private static Log log = LogFactory.getLog(MailService.class);

/**
* @param text - message
* @param from - sender email
* @param to - receiver email
* @param subject - subject
* @param filePath - file to attach, could be null if file not required
* @throws Exception
*/
public void sendMail(final String text, final String from, final String to, final String subject, final File file) throws Exception {
taskExecutor.execute( new Runnable() {
public void run() {
try {
sendMailSimple(text, to, subject, file.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
log.error("Failed to send email to: " + to + " reason: "+e.getMessage());
}
}
});
}

private void sendMailSimple(String text, String from, String to, String subject, String filePath) throws Exception {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text);
if(filePath != null){
FileSystemResource file = new FileSystemResource(filePath);
helper.addAttachment(file.getFilename(), file);
}
} catch (MessagingException e) {
throw new MailParseException(e);
}
mailSender.send(message);

if(log.isDebugEnabled()){
log.debug("Mail was sent successfully to: " + to + " with file: "+filePath);
}
}
}

Spring mail config:


mail.test.com
25
smtp
no-reply@test.com
pass


true

false



Task executor config: