diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2021-07-21 12:46:35 +0200 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2021-07-21 12:46:35 +0200 |
| commit | da613e94970da31409464c81740162f9bd7c7831 (patch) | |
| tree | e16a81890f5e43b771ae8a227580e9a535b82652 /domain/src/main/java | |
| parent | f4dc48cd8359d5b8da35f678ae6630c5c4427769 (diff) | |
feat(): start making heartbeatquery
Diffstat (limited to 'domain/src/main/java')
7 files changed, 276 insertions, 21 deletions
diff --git a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java index fd22ce1..fc03915 100644 --- a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java +++ b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java @@ -2,9 +2,9 @@ package akkamon.domain; public interface AkkamonMessageEngine { // broadcasts position info to WebSocket Clients - void broadCastGridPosition(); + void broadCastToScene(String sceneId, String message); - void registerTrainerSession(String trainerId, AkkamonSession session); + void registerTrainerSessionToScene(String sceneId, AkkamonSession session); - void removeTrainerSession(String trainerId, AkkamonSession session); + void removeTrainerSessionFromScene(String sceneId, AkkamonSession session); } diff --git a/domain/src/main/java/akkamon/domain/AkkamonNexus.java b/domain/src/main/java/akkamon/domain/AkkamonNexus.java index c9e07f0..0b52ffa 100644 --- a/domain/src/main/java/akkamon/domain/AkkamonNexus.java +++ b/domain/src/main/java/akkamon/domain/AkkamonNexus.java @@ -15,7 +15,8 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> { public interface Command {} - public static class RequestTrainerRegistration implements AkkamonNexus.Command, SceneTrainerGroup.Command { + public static class RequestTrainerRegistration + implements AkkamonNexus.Command, SceneTrainerGroup.Command { public String trainerId; public String sceneId; public AkkamonSession session; @@ -47,20 +48,104 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> { } } - public static class RequestStartMoving implements Command, SceneTrainerGroup.Command { + public static class RequestStartMoving + implements Command, SceneTrainerGroup.Command, Trainer.Command { public long requestId; - public String trainerid; + public String trainerId; public String sceneId; public Direction direction; + public ActorRef<AkkamonNexus.Command> replyTo; - public RequestStartMoving(long requestId, String trainerid, String sceneId, Direction direction) { + public RequestStartMoving(long requestId, String trainerId, String sceneId, Direction direction, ActorRef<AkkamonNexus.Command> replyTo) { this.requestId = requestId; - this.trainerid = trainerid; + this.trainerId = trainerId; this.sceneId = sceneId; this.direction = direction; + this.replyTo = replyTo; + } + } + + public static class RequestStopMoving + implements Command, SceneTrainerGroup.Command, Trainer.Command { + public long requestId; + public String trainerId; + public String sceneId; + public Direction direction; + public ActorRef<AkkamonNexus.Command> replyTo; + + public RequestStopMoving( + long requestId, + String trainerId, + String sceneId, + Direction direction, + ActorRef<AkkamonNexus.Command> replyTo) { + this.requestId = requestId; + this.trainerId = trainerId; + this.sceneId = sceneId; + this.direction = direction; + this.replyTo = replyTo; + } + } + + public static class RequestNewTilePos + implements Command, SceneTrainerGroup.Command, Trainer.Command { + public long requestId; + public String trainerId; + public String sceneId; + public TilePos tilePos; + public ActorRef<AkkamonNexus.Command> replyTo; + + public RequestNewTilePos(long requestId, String trainerId, String sceneId, TilePos tilePos, ActorRef<Command> replyTo) { + this.requestId = requestId; + this.trainerId = trainerId; + this.sceneId = sceneId; + this.tilePos = tilePos; + this.replyTo = replyTo; + } + } + + public static class RequestHeartBeat + implements Command, SceneTrainerGroup.Command { + + public long requestId; + public ActorRef<AkkamonNexus.Command> replyTo; + + public RequestHeartBeat(long requestId, ActorRef<AkkamonNexus.Command> replyTo) { + this.requestId = requestId; + this.replyTo = replyTo; } } + public static class RespondHeartBeatQuery implements Command { + + } + + public interface TrainerPositionReading { } + + public static class TrainerPosition implements TrainerPositionReading { + public final TilePos value; + + public TrainerPosition(TilePos value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + TrainerPosition other = (TrainerPosition) o; + + return this.value.x == other.value.x && this.value.y == other.value.y; + } + + @Override + public String toString() { + return "TrainerPosition={x: " + value.x + ", " + value.y + "}"; + } + + } + private static class SceneTrainerGroupTerminated implements AkkamonNexus.Command { public SceneTrainerGroupTerminated(String sceneId) { } @@ -82,21 +167,59 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> { @Override public Receive<Command> createReceive() { return newReceiveBuilder() - .onMessage( - RequestTrainerRegistration.class, - this::onTrainerRegistration - ) - .onMessage( - TrainerRegistered.class, - this::onTrainerRegistered - ) + .onMessage(RequestTrainerRegistration.class, this::onTrainerRegistration) + .onMessage(TrainerRegistered.class, this::onTrainerRegistered) + .onMessage(RequestHeartBeat.class, this::onHeartBeat) + .onMessage(RequestStartMoving.class, this::onStartMoving) + .onMessage(RequestStopMoving.class, this::onStopMoving) + .onMessage(RequestNewTilePos.class, this::onNewTilePos) .build(); } + private AkkamonNexus onHeartBeat(RequestHeartBeat heartBeatRequest) { + return this; + } + + private AkkamonNexus onNewTilePos(RequestNewTilePos newTilePosRequest) { + ActorRef<SceneTrainerGroup.Command> sceneTrainerGroup = sceneIdToActor.get( + newTilePosRequest.sceneId + ); + if (sceneTrainerGroup != null) { + sceneTrainerGroup.tell(newTilePosRequest); + } else { + getContext().getLog().info("Ignoring newTilePos request in scene {}, it isn't mapped to a sceneTrainerActor."); + } + return this; + } + + private AkkamonNexus onStopMoving(RequestStopMoving stopMovingRequest) { + ActorRef<SceneTrainerGroup.Command> sceneTrainerGroup = sceneIdToActor.get( + stopMovingRequest.sceneId + ); + if (sceneTrainerGroup != null) { + sceneTrainerGroup.tell(stopMovingRequest); + } else { + getContext().getLog().info("Ignoring stopMove request in scene {}, it isn't mapped to a sceneTrainerActor."); + } + return this; + } + + private AkkamonNexus onStartMoving(RequestStartMoving startMovingRequest) { + ActorRef<SceneTrainerGroup.Command> sceneTrainerGroup = sceneIdToActor.get( + startMovingRequest.sceneId + ); + if (sceneTrainerGroup != null) { + sceneTrainerGroup.tell(startMovingRequest); + } else { + getContext().getLog().info("Ignoring stopMove request in scene {}, it isn't mapped to a sceneTrainerActor."); + } + return this; + } + private AkkamonNexus onTrainerRegistered(TrainerRegistered reply) { // TODO test when registration fails? getContext().getLog().info("Adding {} to Live AkkamonSessions in Messaging Engine", reply.trainerId); - messageEngine.registerTrainerSession(reply.trainerId, reply.session); + messageEngine.registerTrainerSessionToScene(reply.trainerId, reply.session); return this; } @@ -121,5 +244,4 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> { return this; } - } diff --git a/domain/src/main/java/akkamon/domain/AkkamonSession.java b/domain/src/main/java/akkamon/domain/AkkamonSession.java index b04aaab..68aa1fc 100644 --- a/domain/src/main/java/akkamon/domain/AkkamonSession.java +++ b/domain/src/main/java/akkamon/domain/AkkamonSession.java @@ -2,4 +2,8 @@ package akkamon.domain; public interface AkkamonSession { void send(String event); + + void setTrainerId(String trainerId); + + String getTrainerId(); } diff --git a/domain/src/main/java/akkamon/domain/Direction.java b/domain/src/main/java/akkamon/domain/Direction.java index c0908d8..71343c6 100644 --- a/domain/src/main/java/akkamon/domain/Direction.java +++ b/domain/src/main/java/akkamon/domain/Direction.java @@ -4,5 +4,6 @@ public enum Direction { UP, DOWN, LEFT, - RIGHT + RIGHT, + NONE } diff --git a/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java b/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java index e6bd8ce..f01edc4 100644 --- a/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java +++ b/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java @@ -46,14 +46,100 @@ public class SceneTrainerGroup extends AbstractBehavior<SceneTrainerGroup.Comman return newReceiveBuilder() .onMessage( AkkamonNexus.RequestTrainerRegistration.class, - this::onTrainerRegistration) + this::onTrainerRegistration + ) + .onMessage( + AkkamonNexus.RequestStartMoving.class, + this::onStartMoving + ) + .onMessage( + AkkamonNexus.RequestStopMoving.class, + this::onStopMoving + ) + .onMessage( + AkkamonNexus.RequestNewTilePos.class, + this::onNewTilePos + ) .build(); } + private SceneTrainerGroup onNewTilePos(AkkamonNexus.RequestNewTilePos newTilePosRequest) { + if (this.sceneId.equals(newTilePosRequest.sceneId)) { + ActorRef<Trainer.Command> trainerActor = trainerIdToActor.get(newTilePosRequest.trainerId); + if (trainerActor != null) { + trainerActor.tell(newTilePosRequest); + } else { + getContext() + .getLog() + .warn( + "Ignoring newTilePos for trainerId {}. There is no actor mapped to it.", + newTilePosRequest.trainerId + ); + } + } else { + getContext() + .getLog() + .warn( + "Ignoring newTilePos for {}. This actor is responsible for {}.", + newTilePosRequest.sceneId, + this.sceneId); + } + return this; + } + + private SceneTrainerGroup onStopMoving(AkkamonNexus.RequestStopMoving stopMovingRequest) { + if (this.sceneId.equals(stopMovingRequest.sceneId)) { + ActorRef<Trainer.Command> trainerActor = trainerIdToActor.get(stopMovingRequest.trainerId); + if (trainerActor != null) { + trainerActor.tell(stopMovingRequest); + } else { + getContext() + .getLog() + .warn( + "Ignoring stopMovingRequest for trainerId {}. There is no actor mapped to it.", + stopMovingRequest.trainerId + ); + } + } else { + getContext() + .getLog() + .warn( + "Ignoring stopMovingRequest for {}. This actor is responsible for {}.", + stopMovingRequest.sceneId, + this.sceneId); + } + return this; + } + + private SceneTrainerGroup onStartMoving(AkkamonNexus.RequestStartMoving startMovingRequest) { + if (this.sceneId.equals(startMovingRequest.sceneId)) { + ActorRef<Trainer.Command> trainerActor = trainerIdToActor.get(startMovingRequest.trainerId); + if (trainerActor != null) { + trainerActor.tell(startMovingRequest); + } else { + getContext() + .getLog() + .warn( + "Ignoring startMovingRequest for trainerId {}. There is no actor mapped to it.", + startMovingRequest.trainerId + ); + } + } else { + getContext() + .getLog() + .warn( + "Ignoring startMovingRequest for {}. This actor is responsible for {}.", + startMovingRequest.sceneId, + this.sceneId); + } + return this; + } + private SceneTrainerGroup onTrainerRegistration(AkkamonNexus.RequestTrainerRegistration registrationRequest) { if (this.sceneId.equals(registrationRequest.sceneId)) { ActorRef<Trainer.Command> trainerActor = trainerIdToActor.get(registrationRequest.trainerId); if (trainerActor != null) { + // TODO add optional already registered? registrationRequest.replyTo.tell(new AkkamonNexus.TrainerRegistered( registrationRequest.trainerId, registrationRequest.session diff --git a/domain/src/main/java/akkamon/domain/TilePos.java b/domain/src/main/java/akkamon/domain/TilePos.java new file mode 100644 index 0000000..95e3f71 --- /dev/null +++ b/domain/src/main/java/akkamon/domain/TilePos.java @@ -0,0 +1,10 @@ +package akkamon.domain; + +public class TilePos { + public int x; + public int y; + + public String toString() { + return "tilePos={x: " + x + ", y: " + y + "}"; + } +} diff --git a/domain/src/main/java/akkamon/domain/Trainer.java b/domain/src/main/java/akkamon/domain/Trainer.java index 7f540a1..b756a97 100644 --- a/domain/src/main/java/akkamon/domain/Trainer.java +++ b/domain/src/main/java/akkamon/domain/Trainer.java @@ -6,6 +6,8 @@ import akka.actor.typed.javadsl.ActorContext; import akka.actor.typed.javadsl.Behaviors; import akka.actor.typed.javadsl.Receive; +import java.util.Optional; + public class Trainer extends AbstractBehavior<Trainer.Command> { public interface Command { } @@ -17,6 +19,8 @@ public class Trainer extends AbstractBehavior<Trainer.Command> { private String sceneId; private String trainerId; + private Optional<TilePos> lastValidTilePos = Optional.empty(); + public Trainer(ActorContext<Command> context, String sceneId, String trainerId) { super(context); this.sceneId = sceneId; @@ -25,7 +29,35 @@ public class Trainer extends AbstractBehavior<Trainer.Command> { @Override public Receive<Command> createReceive() { - return null; + return newReceiveBuilder() + .onMessage( + AkkamonNexus.RequestStartMoving.class, + this::onStartMoving + ) + .onMessage( + AkkamonNexus.RequestStopMoving.class, + this::onStopMoving) + .onMessage( + AkkamonNexus.RequestNewTilePos.class, + this::onNewTilePos + ) + .build(); + } + + private Trainer onNewTilePos(AkkamonNexus.RequestNewTilePos newTilePosRequest) { + getContext().getLog().info("Trainer {} has new {}.", trainerId, newTilePosRequest.tilePos); + lastValidTilePos = Optional.of(newTilePosRequest.tilePos); + return this; + } + + private Trainer onStopMoving(AkkamonNexus.RequestStopMoving stopMovingRequest) { + getContext().getLog().info("Trainer {} stops to move {}.", trainerId, stopMovingRequest.direction); + return this; + } + + private Trainer onStartMoving(AkkamonNexus.RequestStartMoving startMovingRequest) { + getContext().getLog().info("Trainer {} starts to move {}.", trainerId, startMovingRequest.direction); + return this; } } |
