From 4d84c12df52c89abb7d3ba9f565753116b99dbf0 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Tue, 27 Jul 2021 21:40:04 +0200 Subject: feat(): interaction handshaker setup --- .../java/akkamon/domain/AkkamonMessageEngine.java | 7 ++- .../src/main/java/akkamon/domain/AkkamonNexus.java | 45 +++++++++++++++-- .../java/akkamon/domain/InteractionHandshaker.java | 57 ++++++++++++++++++++++ 3 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 domain/src/main/java/akkamon/domain/InteractionHandshaker.java (limited to 'domain') diff --git a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java index 05efc32..c3ed445 100644 --- a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java +++ b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java @@ -1,14 +1,19 @@ package akkamon.domain; +import java.util.List; import java.util.Map; public interface AkkamonMessageEngine { // broadcasts position info to WebSocket Clients void broadCastHeartBeatToScene(String sceneId, Map trainerPositions); - void registerTrainerSessionToScene(String sceneId, AkkamonSession session); + void broadCastInteractionRequestToSessionWithTrainerIds(List trainerIds, String type, String trainerId, long requestId); + + void registerTrainerSessionToSceneAndTrainerIdMaps(String sceneId, AkkamonSession session); void removeTrainerSessionFromScene(String sceneId, AkkamonSession session); void trainerDisconnected(AkkamonSession session); + + void broadCastMessageToSessionsWithTrainerIds(List needConfirmation, String type, String trainerId, long requestid); } diff --git a/domain/src/main/java/akkamon/domain/AkkamonNexus.java b/domain/src/main/java/akkamon/domain/AkkamonNexus.java index 4958e21..edc8c05 100644 --- a/domain/src/main/java/akkamon/domain/AkkamonNexus.java +++ b/domain/src/main/java/akkamon/domain/AkkamonNexus.java @@ -7,16 +7,34 @@ import akka.actor.typed.javadsl.ActorContext; import akka.actor.typed.javadsl.Behaviors; import akka.actor.typed.javadsl.Receive; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.Queue; +import java.time.Duration; +import java.util.*; public class AkkamonNexus extends AbstractBehavior { public interface Command {} + public static class RequestInteraction + implements Command { + + public long requestId; + public String type; + public String sceneId; + public String trainerId; + public List forwardTo; + public ActorRef replyTo; + + public RequestInteraction(long requestId, String type, String sceneId, String trainerId, List forwardTo, ActorRef replyTo) { + this.requestId = requestId; + this.type = type; + this.sceneId = sceneId; + this.trainerId = trainerId; + this.forwardTo = forwardTo; + this.replyTo = replyTo; + } + } + public static class RequestTrainerRegistration implements AkkamonNexus.Command, SceneTrainerGroup.Command { public String trainerId; @@ -220,9 +238,26 @@ public class AkkamonNexus extends AbstractBehavior { .onMessage(RequestStartMoving.class, this::onStartMoving) .onMessage(RequestStopMoving.class, this::onStopMoving) .onMessage(RequestNewTilePos.class, this::onNewTilePos) + .onMessage(RequestInteraction.class, this::onInteractionRequest) .build(); } + private AkkamonNexus onInteractionRequest(RequestInteraction interactionRequest) { + List needConfirmation = interactionRequest.forwardTo; + messageEngine.broadCastMessageToSessionsWithTrainerIds(needConfirmation, interactionRequest.type, interactionRequest.trainerId, interactionRequest.requestId); + + ActorRef getContext().spawn( + InteractionHandshaker.create( + interactionRequest.trainerId, + interactionRequest.forwardTo, + interactionRequest.requestId, + interactionRequest.replyTo, + Duration.ofSeconds(20) + ) + ); + return this; + } + private AkkamonNexus onTrainerOffline(RespondTrainerOffline trainerOfflineMsg) { getContext().getLog().info("Removing {} from akkamon sessions!", trainerOfflineMsg.session.getTrainerId()); messageEngine.removeTrainerSessionFromScene(trainerOfflineMsg.sceneId, trainerOfflineMsg.session); @@ -306,7 +341,7 @@ public class AkkamonNexus extends AbstractBehavior { // TODO test when registration fails? getContext().getLog().info("Adding {} to scene {} Live AkkamonSessions in Messaging Engine", reply.trainerId, reply.sceneId); reply.session.setTrainerId(reply.trainerId); - messageEngine.registerTrainerSessionToScene(reply.sceneId, reply.session); + messageEngine.registerTrainerSessionToSceneAndTrainerIdMaps(reply.sceneId, reply.session); return this; } diff --git a/domain/src/main/java/akkamon/domain/InteractionHandshaker.java b/domain/src/main/java/akkamon/domain/InteractionHandshaker.java new file mode 100644 index 0000000..78d63de --- /dev/null +++ b/domain/src/main/java/akkamon/domain/InteractionHandshaker.java @@ -0,0 +1,57 @@ +package akkamon.domain; + +import akka.actor.Timers; +import akka.actor.typed.ActorRef; +import akka.actor.typed.Behavior; +import akka.actor.typed.javadsl.*; + +import java.time.Duration; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class InteractionHandshaker extends AbstractBehavior { + + public interface Command { + } + + + public static Behavior create( + String trainerId, + List needingConfirmation, + long requestId, + ActorRef replyTo, + Duration timeout) { + + return Behaviors.setup( + context -> Behaviors.withTimers( + timers -> new InteractionHandshaker( + context, + trainerId, + new HashSet(needingConfirmation), + requestId, + replyTo, + timeout, + timers + ) + ) + ); + + } + + public InteractionHandshaker(ActorContext context, + String trainerId, + Set needingConfirmation, + long requestId, + ActorRef replyTo, + Duration timeout, + TimerScheduler timers) { + super(context); + } + + @Override + public Receive createReceive() { + return null; + } + +} -- cgit v1.2.3