diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2021-07-27 21:40:04 +0200 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2021-07-27 21:40:04 +0200 |
| commit | 4d84c12df52c89abb7d3ba9f565753116b99dbf0 (patch) | |
| tree | e241b91506738628b919c2af190ed14ac72c3f06 /domain | |
| parent | 019ea5fcefa16c2746fb2c7d6fa4a29d18b8d53b (diff) | |
feat(): interaction handshaker setup
Diffstat (limited to 'domain')
3 files changed, 103 insertions, 6 deletions
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<String, AkkamonNexus.MovementQueueReading> trainerPositions); - void registerTrainerSessionToScene(String sceneId, AkkamonSession session); + void broadCastInteractionRequestToSessionWithTrainerIds(List<String> 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<String> 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<AkkamonNexus.Command> { public interface Command {} + public static class RequestInteraction + implements Command { + + public long requestId; + public String type; + public String sceneId; + public String trainerId; + public List<String> forwardTo; + public ActorRef<Command> replyTo; + + public RequestInteraction(long requestId, String type, String sceneId, String trainerId, List<String> forwardTo, ActorRef<Command> 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<AkkamonNexus.Command> { .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<String> needConfirmation = interactionRequest.forwardTo; + messageEngine.broadCastMessageToSessionsWithTrainerIds(needConfirmation, interactionRequest.type, interactionRequest.trainerId, interactionRequest.requestId); + + ActorRef<InteractionHandshaker.Command> 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<AkkamonNexus.Command> { // 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<InteractionHandshaker.Command> { + + public interface Command { + } + + + public static Behavior<Command> create( + String trainerId, + List<String> needingConfirmation, + long requestId, + ActorRef<AkkamonNexus.Command> replyTo, + Duration timeout) { + + return Behaviors.setup( + context -> Behaviors.withTimers( + timers -> new InteractionHandshaker( + context, + trainerId, + new HashSet(needingConfirmation), + requestId, + replyTo, + timeout, + timers + ) + ) + ); + + } + + public InteractionHandshaker(ActorContext<Command> context, + String trainerId, + Set<String> needingConfirmation, + long requestId, + ActorRef<AkkamonNexus.Command> replyTo, + Duration timeout, + TimerScheduler<Command> timers) { + super(context); + } + + @Override + public Receive<Command> createReceive() { + return null; + } + +} |
