7_9_refactoring_send_to_group · JavaWebinar/masterjava@b33b04c · GitHub
Skip to content

Commit b33b04c

Browse files
committed
7_9_refactoring_send_to_group
1 parent 85988f2 commit b33b04c

12 files changed

Lines changed: 93 additions & 114 deletions

File tree

services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/Addressee.java

Lines changed: 2 additions & 4 deletions
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package ru.javaops.masterjava.service.mail;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
import java.util.List;
8+
9+
@Data
10+
@AllArgsConstructor
11+
@NoArgsConstructor
12+
public class GroupResult {
13+
private int success; // number of successfully sent email
14+
private List<MailResult> failed; // failed emails with causes
15+
private String failedCause; // global fail cause
16+
17+
@Override
18+
public String toString() {
19+
return "Success: " + success + '\n' +
20+
(failed == null ? "" : "Failed: " + failed.toString() + '\n') +
21+
(failedCause == null ? "" : "Failed cause: " + failedCause);
22+
}
23+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package ru.javaops.masterjava.service.mail;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
import lombok.NonNull;
7+
8+
@Data
9+
@AllArgsConstructor
10+
@NoArgsConstructor
11+
public class MailResult {
12+
public static final String OK = "OK";
13+
14+
private @NonNull String email;
15+
private String result;
16+
17+
public boolean isOk() {
18+
return OK.equals(result);
19+
}
20+
21+
@Override
22+
public String toString() {
23+
return '\'' + email + "' result '" + result + '\'';
24+
}
25+
}

services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import javax.jws.WebMethod;
44
import javax.jws.WebParam;
55
import javax.jws.WebService;
6-
import java.util.List;
6+
import java.util.Set;
77

88
@WebService(targetNamespace = "http://mail.javaops.ru/")
99
//@SOAPBinding(
@@ -13,9 +13,9 @@
1313
public interface MailService {
1414

1515
@WebMethod
16-
void sendMail(
17-
@WebParam(name = "to") List<Addressee> to,
18-
@WebParam(name = "cc") List<Addressee> cc,
16+
String sendToGroup(
17+
@WebParam(name = "to") Set<Addressee> to,
18+
@WebParam(name = "cc") Set<Addressee> cc,
1919
@WebParam(name = "subject") String subject,
2020
@WebParam(name = "body") String body);
2121
}

services/mail-api/src/main/java/ru/javaops/masterjava/service/mail/MailWSClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import ru.javaops.masterjava.web.WsClient;
66

77
import javax.xml.namespace.QName;
8-
import java.util.List;
8+
import java.util.Set;
99

1010
@Slf4j
1111
public class MailWSClient {
@@ -20,8 +20,8 @@ public class MailWSClient {
2020
}
2121

2222

23-
public static void sendMail(final List<Addressee> to, final List<Addressee> cc, final String subject, final String body) {
23+
public static void sendToGroup(final Set<Addressee> to, final Set<Addressee> cc, final String subject, final String body) {
2424
log.info("Send mail to '" + to + "' cc '" + cc + "' subject '" + subject + (log.isDebugEnabled() ? "\nbody=" + body : ""));
25-
WS_CLIENT.getPort().sendMail(to, cc, subject, body);
25+
WS_CLIENT.getPort().sendToGroup(to, cc, subject, body);
2626
}
2727
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package ru.javaops.masterjava.service.mail;
22

3-
import com.google.common.collect.ImmutableList;
3+
import com.google.common.collect.ImmutableSet;
44

55
public class MailWSClientMain {
66
public static void main(String[] args) {
7-
MailWSClient.sendMail(
8-
ImmutableList.of(new Addressee("To <masterjava@javaops.ru>")),
9-
ImmutableList.of(new Addressee("Copy <masterjava@javaops.ru>")), "Subject", "Body");
7+
MailWSClient.sendToGroup(
8+
ImmutableSet.of(new Addressee("To <masterjava@javaops.ru>")),
9+
ImmutableSet.of(new Addressee("Copy <masterjava@javaops.ru>")), "Subject", "Body");
1010
}
1111
}

services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/MailSender.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
package ru.javaops.masterjava.service.mail;
22

33
import com.google.common.collect.ImmutableMap;
4+
import com.google.common.collect.ImmutableSet;
45
import lombok.extern.slf4j.Slf4j;
56
import lombok.val;
67
import org.apache.commons.mail.EmailException;
78
import ru.javaops.masterjava.persist.DBIProvider;
89
import ru.javaops.masterjava.service.mail.persist.MailCase;
910
import ru.javaops.masterjava.service.mail.persist.MailCaseDao;
1011

11-
import java.util.List;
12+
import java.util.Set;
1213

1314
@Slf4j
1415
public class MailSender {
1516
private static final MailCaseDao MAIL_CASE_DAO = DBIProvider.getDao(MailCaseDao.class);
1617

17-
static void sendMail(List<Addressee> to, List<Addressee> cc, String subject, String body) {
18+
static MailResult sendTo(Addressee to, String subject, String body) {
19+
val state = sendToGroup(ImmutableSet.of(to), ImmutableSet.of(), subject, body);
20+
return new MailResult(to.getEmail(), state);
21+
}
22+
23+
static String sendToGroup(Set<Addressee> to, Set<Addressee> cc, String subject, String body) {
1824
log.info("Send mail to \'" + to + "\' cc \'" + cc + "\' subject \'" + subject + (log.isDebugEnabled() ? "\nbody=" + body : ""));
19-
String state = "OK";
25+
String state = MailResult.OK;
2026
try {
2127
val email = MailConfig.createHtmlEmail();
2228
email.setSubject(subject);
@@ -38,5 +44,6 @@ static void sendMail(List<Addressee> to, List<Addressee> cc, String subject, Str
3844
}
3945
MAIL_CASE_DAO.insert(MailCase.of(to, cc, subject, state));
4046
log.info("Sent with state: " + state);
47+
return state;
4148
}
4249
}
Lines changed: 12 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
package ru.javaops.masterjava.service.mail;
22

3+
import lombok.extern.slf4j.Slf4j;
4+
import one.util.streamex.StreamEx;
5+
36
import java.util.ArrayList;
47
import java.util.List;
58
import java.util.Set;
69
import java.util.concurrent.*;
7-
import java.util.stream.Collectors;
810

11+
@Slf4j
912
public class MailServiceExecutor {
10-
private static final String OK = "OK";
1113

1214
private static final String INTERRUPTED_BY_FAULTS_NUMBER = "+++ Interrupted by faults number";
1315
private static final String INTERRUPTED_BY_TIMEOUT = "+++ Interrupted by timeout";
1416
private static final String INTERRUPTED_EXCEPTION = "+++ InterruptedException";
1517

16-
private final ExecutorService mailExecutor = Executors.newFixedThreadPool(8);
18+
private static final ExecutorService mailExecutor = Executors.newFixedThreadPool(8);
1719

18-
public GroupResult sendToList(final String template, final Set<String> emails) throws Exception {
20+
public static GroupResult sendBulk(final Set<Addressee> addressees, final String subject, final String body) {
1921
final CompletionService<MailResult> completionService = new ExecutorCompletionService<>(mailExecutor);
2022

21-
List<Future<MailResult>> futures = emails.stream()
22-
.map(email -> completionService.submit(() -> sendToUser(template, email)))
23-
.collect(Collectors.toList());
23+
List<Future<MailResult>> futures = StreamEx.of(addressees)
24+
.map(addressee -> completionService.submit(() -> MailSender.sendTo(addressee, subject, body)))
25+
.toList();
2426

2527
return new Callable<GroupResult>() {
2628
private int success = 0;
@@ -50,29 +52,9 @@ public GroupResult call() {
5052
return cancelWithFail(INTERRUPTED_EXCEPTION);
5153
}
5254
}
53-
/*
54-
for (Future<MailResult> future : futures) {
55-
MailResult mailResult;
56-
try {
57-
mailResult = future.get(10, TimeUnit.SECONDS);
58-
} catch (InterruptedException e) {
59-
return cancelWithFail(INTERRUPTED_EXCEPTION);
60-
} catch (ExecutionException e) {
61-
return cancelWithFail(e.getCause().toString());
62-
} catch (TimeoutException e) {
63-
return cancelWithFail(INTERRUPTED_BY_TIMEOUT);
64-
}
65-
if (mailResult.isOk()) {
66-
success++;
67-
} else {
68-
failed.add(mailResult);
69-
if (failed.size() >= 5) {
70-
return cancelWithFail(INTERRUPTED_BY_FAULTS_NUMBER);
71-
}
72-
}
73-
}
74-
*/
75-
return new GroupResult(success, failed, null);
55+
GroupResult groupResult = new GroupResult(success, failed, null);
56+
log.info("groupResult: {}", groupResult);
57+
return groupResult;
7658
}
7759

7860
private GroupResult cancelWithFail(String cause) {
@@ -81,61 +63,4 @@ private GroupResult cancelWithFail(String cause) {
8163
}
8264
}.call();
8365
}
84-
85-
// dummy realization
86-
public MailResult sendToUser(String template, String email) throws Exception {
87-
try {
88-
Thread.sleep(500); //delay
89-
} catch (InterruptedException e) {
90-
// log cancel;
91-
return null;
92-
}
93-
return Math.random() < 0.7 ? MailResult.ok(email) : MailResult.error(email, "Error");
94-
}
95-
96-
public static class MailResult {
97-
private final String email;
98-
private final String result;
99-
100-
private static MailResult ok(String email) {
101-
return new MailResult(email, OK);
102-
}
103-
104-
private static MailResult error(String email, String error) {
105-
return new MailResult(email, error);
106-
}
107-
108-
public boolean isOk() {
109-
return OK.equals(result);
110-
}
111-
112-
private MailResult(String email, String cause) {
113-
this.email = email;
114-
this.result = cause;
115-
}
116-
117-
@Override
118-
public String toString() {
119-
return '(' + email + ',' + result + ')';
120-
}
121-
}
122-
123-
public static class GroupResult {
124-
private final int success; // number of successfully sent email
125-
private final List<MailResult> failed; // failed emails with causes
126-
private final String failedCause; // global fail cause
127-
128-
public GroupResult(int success, List<MailResult> failed, String failedCause) {
129-
this.success = success;
130-
this.failed = failed;
131-
this.failedCause = failedCause;
132-
}
133-
134-
@Override
135-
public String toString() {
136-
return "Success: " + success + '\n' +
137-
"Failed: " + failed.toString() + '\n' +
138-
(failedCause == null ? "" : "Failed cause" + failedCause);
139-
}
140-
}
14166
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package ru.javaops.masterjava.service.mail;
22

33
import javax.jws.WebService;
4-
import java.util.List;
4+
import java.util.Set;
55

66
@WebService(endpointInterface = "ru.javaops.masterjava.service.mail.MailService", targetNamespace = "http://mail.javaops.ru/"
77
// , wsdlLocation = "WEB-INF/wsdl/mailService.wsdl"
88
)
99
public class MailServiceImpl implements MailService {
10-
public void sendMail(List<Addressee> to, List<Addressee> cc, String subject, String body) {
11-
MailSender.sendMail(to, cc, subject, body);
10+
public String sendToGroup(Set<Addressee> to, Set<Addressee> cc, String subject, String body) {
11+
return MailSender.sendToGroup(to, cc, subject, body);
1212
}
1313
}

services/mail-service/src/main/java/ru/javaops/masterjava/service/mail/persist/MailCase.java

Lines changed: 2 additions & 2 deletions

0 commit comments

Comments
 (0)