package com.gravspace.handlers; import java.util.HashMap; import java.util.Map; import com.gravspace.messages.GetSession; import com.gravspace.messages.KeepAlive; import com.gravspace.messages.KillSession; import akka.actor.PoisonPill; import akka.actor.Props; import akka.actor.UntypedActor; import akka.actor.ActorRef; import akka.event.Logging; import akka.event.LoggingAdapter; public class SessionHandler extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); Map<String, ActorRef> sessions = new HashMap<>(); @Override public void onReceive(Object message) throws Exception { log.info("Session Handler got: "+message.getClass().getCanonicalName()); if (message instanceof GetSession){ GetSession sessionRequest = (GetSession)message; if (!sessions.containsKey(sessionRequest.getSessionId())){ ActorRef session = this.getContext().actorOf(Props.create(Session.class, self(), sessionRequest.getSessionId()), "Session-"+sessionRequest.getSessionId()); sessions.put(sessionRequest.getSessionId(), session); } ActorRef session = sessions.get(sessionRequest.getSessionId()); getSender().tell(session, self()); session.tell(new KeepAlive(), self()); } else if (message instanceof KillSession) { KillSession sessionRequest = (KillSession)message; ActorRef session = sessions.remove(sessionRequest.getSessionId()); if (session == null){ getSender().tell("OK", self()); } else { getSender().tell("OK", self()); session.tell(PoisonPill.getInstance(), self()); } } else { unhandled(message); } } }