Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fc4c538

Browse files
committed
11_7_akka_untyped
1 parent 659d8d1 commit fc4c538

File tree

5 files changed

+92
-6
lines changed

5 files changed

+92
-6
lines changed

services/akka-remote/src/main/java/ru/javaops/masterjava/akka/AkkaActivator.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package ru.javaops.masterjava.akka;
22

3-
import akka.actor.ActorSystem;
4-
import akka.actor.TypedActor;
5-
import akka.actor.TypedProps;
3+
import akka.actor.*;
64
import akka.japi.Creator;
75
import akka.util.Timeout;
86
import lombok.extern.slf4j.Slf4j;
@@ -33,11 +31,21 @@ public <T> void startTypedActor(Class<T> typedClass, String name, Creator<T> cre
3331
new TypedProps<T>(typedClass, creator).withTimeout(new Timeout(Duration.create(20, TimeUnit.SECONDS))), name);
3432
}
3533

34+
public <T> ActorRef startActor(Class<T> actorClass, String name) {
35+
log.info("Start AKKA actor: {}", name);
36+
return system.actorOf(Props.create(actorClass), name);
37+
}
38+
3639
public <T> T getTypedRef(Class<T> typedClass, String path) {
3740
log.info("Get typed reference with path={}", path);
3841
return TypedActor.get(system).typedActorOf(new TypedProps<T>(typedClass), system.actorFor(path));
3942
}
4043

44+
public ActorRef getActorRef(String path) {
45+
log.info("Get actor reference with path={}", path);
46+
return system.actorFor(path);
47+
}
48+
4149
public ExecutionContext getExecutionContext() {
4250
return system.dispatcher();
4351
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ public class MailServiceExecutor {
2323

2424
private static final ExecutorService mailExecutor = Executors.newFixedThreadPool(8);
2525

26+
public static GroupResult sendBulk(final MailObject mailObject) throws WebStateException {
27+
return sendBulk(MailUtils.split(mailObject.getUsers()),
28+
mailObject.getSubject(), mailObject.getBody(), MailUtils.getAttachments(mailObject.getAttachments()));
29+
}
30+
2631
public static GroupResult sendBulk(final Set<Addressee> addressees, final String subject, final String body, List<Attachment> attachments) throws WebStateException {
2732
final CompletionService<MailResult> completionService = new ExecutorCompletionService<>(mailExecutor);
2833

@@ -76,9 +81,7 @@ private void cancel(String cause, Throwable t) throws WebStateException {
7681

7782
public static scala.concurrent.Future<GroupResult> sendAsyncWithReply(MailObject mailObject, ExecutionContext ec) {
7883
// http://doc.akka.io/docs/akka/current/java/futures.html
79-
return Futures.future(
80-
() -> sendBulk(MailUtils.split(mailObject.getUsers()), mailObject.getSubject(), mailObject.getBody(), MailUtils.getAttachments(mailObject.getAttachments())),
81-
ec);
84+
return Futures.future(() -> sendBulk(mailObject), ec);
8285
}
8386

8487
public static void sendAsync(MailObject mailObject) {

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

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

3+
import akka.actor.AbstractActor;
34
import akka.japi.Creator;
45
import lombok.extern.slf4j.Slf4j;
56
import ru.javaops.masterjava.akka.AkkaActivator;
7+
import ru.javaops.masterjava.service.mail.GroupResult;
68
import ru.javaops.masterjava.service.mail.MailRemoteService;
79
import ru.javaops.masterjava.service.mail.MailServiceExecutor;
10+
import ru.javaops.masterjava.service.mail.util.MailUtils;
811

912
import javax.servlet.ServletContextEvent;
1013
import javax.servlet.ServletContextListener;
@@ -21,10 +24,26 @@ public void contextInitialized(ServletContextEvent sce) {
2124
akkaActivator.startTypedActor(MailRemoteService.class, "mail-remote-service",
2225
(Creator<MailRemoteService>) () ->
2326
mailObject -> MailServiceExecutor.sendAsyncWithReply(mailObject, akkaActivator.getExecutionContext()));
27+
akkaActivator.startActor(MailActor.class, "mail-actor");
2428
}
2529

2630
@Override
2731
public void contextDestroyed(ServletContextEvent sce) {
2832
akkaActivator.shutdown();
2933
}
34+
35+
public static class MailActor extends AbstractActor {
36+
@Override
37+
public Receive createReceive() {
38+
return receiveBuilder().match(MailUtils.MailObject.class,
39+
mailObject -> {
40+
log.info("Receive mail form webappActor");
41+
GroupResult groupResult = MailServiceExecutor.sendBulk(mailObject);
42+
log.info("Send result to webappActor");
43+
sender().tell(groupResult, self());
44+
})
45+
.build();
46+
}
47+
}
48+
3049
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package ru.javaops.masterjava.webapp.akka;
2+
3+
import akka.actor.AbstractActor;
4+
import akka.actor.ActorRef;
5+
import lombok.extern.slf4j.Slf4j;
6+
import ru.javaops.masterjava.service.mail.GroupResult;
7+
import ru.javaops.masterjava.service.mail.util.MailUtils.MailObject;
8+
9+
import javax.servlet.ServletConfig;
10+
import javax.servlet.ServletException;
11+
import javax.servlet.annotation.MultipartConfig;
12+
import javax.servlet.annotation.WebServlet;
13+
import javax.servlet.http.HttpServlet;
14+
import javax.servlet.http.HttpServletRequest;
15+
import javax.servlet.http.HttpServletResponse;
16+
import java.io.IOException;
17+
18+
import static ru.javaops.masterjava.webapp.WebUtil.createMailObject;
19+
import static ru.javaops.masterjava.webapp.WebUtil.doAndWriteResponse;
20+
import static ru.javaops.masterjava.webapp.akka.AkkaWebappListener.akkaActivator;
21+
22+
@WebServlet(value = "/sendAkkaUntyped", loadOnStartup = 1)
23+
@Slf4j
24+
@MultipartConfig
25+
public class AkkaUntypedSendServlet extends HttpServlet {
26+
private ActorRef webappActor;
27+
private ActorRef mailActor;
28+
29+
@Override
30+
public void init(ServletConfig config) throws ServletException {
31+
super.init(config);
32+
webappActor = akkaActivator.startActor(WebappActor.class, "mail-client");
33+
mailActor = akkaActivator.getActorRef("akka.tcp://[email protected]:2553/user/mail-actor");
34+
}
35+
36+
@Override
37+
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
38+
req.setCharacterEncoding("UTF-8");
39+
doAndWriteResponse(resp, () -> sendAkka(createMailObject(req)));
40+
}
41+
42+
private String sendAkka(MailObject mailObject) {
43+
mailActor.tell(mailObject, webappActor);
44+
return "Successfully sent AKKA message";
45+
}
46+
47+
public static class WebappActor extends AbstractActor {
48+
@Override
49+
public Receive createReceive() {
50+
return receiveBuilder().match(GroupResult.class,
51+
groupResult -> log.info(groupResult.toString()))
52+
.build();
53+
}
54+
}
55+
}

web/webapp/src/main/webapp/WEB-INF/templates/users.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
<input type="radio" name="transport" onchange="setUrl('/mail/rest/send');">REST<br>
4848
<input type="radio" name="transport" onchange="setUrl('sendJms');">JMS<br>
4949
<input type="radio" name="transport" onchange="setUrl('sendAkkaTyped');">AKKA Typed<br>
50+
<input type="radio" name="transport" onchange="setUrl('sendAkkaUntyped')">AKKA Untyped<br>
5051
</p>
5152
<p>
5253
<button type="button" onclick="send()">Send</button>

0 commit comments

Comments
 (0)