/** * Copyright (C) 2009-2017 Lightbend Inc. */ package tutorial_3 import akka.actor.{ Actor, ActorLogging, ActorRef, Props, Terminated } import tutorial_3.DeviceManager.RequestTrackDevice object DeviceManager { def props(): Props = Props(new DeviceManager) case class RequestTrackDevice(groupId: String, deviceId: String) case object DeviceRegistered } class DeviceManager extends Actor with ActorLogging { var groupIdToActor = Map.empty[String, ActorRef] var actorToGroupId = Map.empty[ActorRef, String] override def preStart(): Unit = log.info("DeviceManager started") override def postStop(): Unit = log.info("DeviceManager stopped") override def receive = { case trackMsg @ RequestTrackDevice(groupId, _) => groupIdToActor.get(groupId) match { case Some(ref) => ref forward trackMsg case None => log.info(s"Creating device group actor for $groupId") val groupActor = context.actorOf(DeviceGroup.props(groupId), "group-" + groupId) context.watch(groupActor) groupActor forward trackMsg groupIdToActor += groupId -> groupActor actorToGroupId += groupActor -> groupId } case Terminated(groupActor) => val groupId = actorToGroupId(groupActor) log.info(s"Device group actor for $groupId has been terminated") actorToGroupId -= groupActor groupIdToActor -= groupId } }