Skip to content
This repository was archived by the owner on Dec 12, 2018. It is now read-only.

Commit 6e5b131

Browse files
authored
Merge pull request #1360 from stormpath/async_email
made email async
2 parents ec38718 + 8a1ecf3 commit 6e5b131

File tree

1 file changed

+52
-56
lines changed

1 file changed

+52
-56
lines changed

impl/src/main/java/com/stormpath/sdk/impl/mail/CommonsEmailService.java

Lines changed: 52 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import java.io.InputStream;
2626
import java.util.LinkedHashMap;
2727
import java.util.Map;
28+
import java.util.concurrent.ExecutorService;
29+
import java.util.concurrent.Executors;
2830

2931
import static com.stormpath.sdk.mail.MimeType.*;
3032

@@ -42,6 +44,8 @@ public class CommonsEmailService implements EmailService {
4244

4345
private final Logger log = LoggerFactory.getLogger(CommonsEmailService.class);
4446

47+
private final ExecutorService executorService = Executors.newCachedThreadPool();
48+
4549
private final TemplateRenderer templateRenderer;
4650
private final EmailServiceConfig config;
4751
private final ResourceFactory resourceFactory;
@@ -64,78 +68,70 @@ public void sendResetEmail(EmailRequest request) {
6468
}
6569

6670
@Override
67-
public void sendEmail(EmailRequest request, String template) {
68-
69-
try (InputStream inputStream = resourceFactory.createResource(template).getInputStream()) {
71+
public void sendEmail(final EmailRequest request, final String template) {
7072

71-
Map<String, Object> context = new LinkedHashMap<>();
73+
executorService.execute(new Runnable() {
7274

73-
ObjectMapper objectMapper = new ObjectMapper();
74-
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
75-
EmailTemplate emailTemplate = objectMapper.readValue(inputStream, EmailTemplate.class);
75+
@Override
76+
public void run() {
77+
log.debug("Start email send to: {}", request.getToAddress());
78+
try (InputStream inputStream = resourceFactory.createResource(template).getInputStream()) {
7679

77-
String url = emailTemplate.getDefaultModel().get("linkBaseUrl") + "?sptoken=" + request.getToken();
80+
Map<String, Object> context = new LinkedHashMap<>();
7881

79-
context.put(APPLICATION_BASE_URL, url);
82+
ObjectMapper objectMapper = new ObjectMapper();
83+
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
84+
EmailTemplate emailTemplate = objectMapper.readValue(inputStream, EmailTemplate.class);
8085

81-
context.put(FROM_NAME, emailTemplate.getFromName());
82-
context.put(FROM_EMAIL_ADDRESS, emailTemplate.getFromName());
83-
context.put(SUBJECT, emailTemplate.getSubject());
86+
String url = emailTemplate.getDefaultModel().get("linkBaseUrl") + "?sptoken=" + request.getToken();
8487

85-
context.put(EXPIRE_WINDOW_HOURS, config.getTokenExpirationHours());
88+
context.put(APPLICATION_BASE_URL, url);
8689

87-
context.put(TO_EMAIL_ADDRESS, request.getToAddress());
88-
context.put(TO_NAME, request.getToDisplayName());
90+
context.put(FROM_NAME, emailTemplate.getFromName());
91+
context.put(FROM_EMAIL_ADDRESS, emailTemplate.getFromName());
92+
context.put(SUBJECT, emailTemplate.getSubject());
8993

90-
try {
91-
Email email;
92-
MimeType mimeType = MimeType.fromString(emailTemplate.getMimeType());
94+
context.put(EXPIRE_WINDOW_HOURS, config.getTokenExpirationHours());
9395

94-
if (PLAIN_TEXT == mimeType) {
96+
context.put(TO_EMAIL_ADDRESS, request.getToAddress());
97+
context.put(TO_NAME, request.getToDisplayName());
9598

96-
SimpleEmail simpleEmail = new SimpleEmail();
97-
simpleEmail.setMsg(renderEmail(emailTemplate.getTextBody(), context).toString());
98-
email = simpleEmail;
99-
} else if (HTML == mimeType) {
100-
101-
HtmlEmail htmlEmail = new HtmlEmail();
102-
htmlEmail.setHtmlMsg(renderEmail(emailTemplate.getHtmlBody(), context).toString());
103-
email = htmlEmail;
104-
} else { // both
105-
HtmlEmail htmlEmail = new HtmlEmail();
106-
htmlEmail.setHtmlMsg(renderEmail(emailTemplate.getHtmlBody(), context).toString());
107-
htmlEmail.setTextMsg(renderEmail(emailTemplate.getTextBody(), context).toString());
108-
email = htmlEmail;
109-
}
99+
try {
100+
Email email;
101+
MimeType mimeType = MimeType.fromString(emailTemplate.getMimeType());
110102

111-
email.setFrom(emailTemplate.getFromEmailAddress(), emailTemplate.getFromName());
112-
email.addTo(request.getToAddress(), request.getToDisplayName());
113-
email.setSubject(emailTemplate.getSubject());
103+
if (PLAIN_TEXT == mimeType) {
114104

115-
// now send it away
116-
sendEmail(email);
117-
} catch (EmailException e) {
105+
SimpleEmail simpleEmail = new SimpleEmail();
106+
simpleEmail.setMsg(renderEmail(emailTemplate.getTextBody(), context).toString());
107+
email = simpleEmail;
108+
} else if (HTML == mimeType) {
118109

119-
String message = "Failed to send email.";
120-
log.warn(message, e);
110+
HtmlEmail htmlEmail = new HtmlEmail();
111+
htmlEmail.setHtmlMsg(renderEmail(emailTemplate.getHtmlBody(), context).toString());
112+
email = htmlEmail;
113+
} else { // both
114+
HtmlEmail htmlEmail = new HtmlEmail();
115+
htmlEmail.setHtmlMsg(renderEmail(emailTemplate.getHtmlBody(), context).toString());
116+
htmlEmail.setTextMsg(renderEmail(emailTemplate.getTextBody(), context).toString());
117+
email = htmlEmail;
118+
}
121119

122-
DefaultError error = new DefaultError(null);
123-
error.setMessage(message);
124-
error.setDeveloperMessage(e.getMessage());
120+
email.setFrom(emailTemplate.getFromEmailAddress(), emailTemplate.getFromName());
121+
email.addTo(request.getToAddress(), request.getToDisplayName());
122+
email.setSubject(emailTemplate.getSubject());
125123

126-
throw new ResourceException(error);
124+
// now send it away
125+
sendEmail(email);
126+
log.debug("Finish email send to: {}", request.getToAddress());
127+
} catch (EmailException e) {
128+
log.error("Failed to send email: {}", e.getMessage(), e);
129+
}
130+
} catch (IOException e) {
131+
log.warn("Failed to parse email template: {}", e.getMessage(), e);
132+
}
127133
}
128-
} catch (IOException e) {
129-
String message = "Failed to parse email template.";
130-
log.warn(message, e);
131-
132-
DefaultError error = new DefaultError(null);
133-
error.setStatus(500);
134-
error.setMessage(message);
135-
error.setDeveloperMessage(e.getMessage());
136-
137-
throw new ResourceException(error);
138-
}
134+
});
139135
}
140136

141137
protected void sendEmail(Email email) throws EmailException {

0 commit comments

Comments
 (0)