по запросу актер получает или создает

Я могу создавать актеров с помощью actOfи смотреть их с помощью ActorFor. Теперь я хочу получить актера по некоторым . ] id:String, и если она не существует, я хочу, чтобы она была создана.Что-то вроде этого:

  def getRCActor(id: String):ActorRef = {
    Logger.info("getting actor %s".format(id))
    var a = system.actorFor(id)
    if(a.isTerminated){
      Logger.info("actor is terminated, creating new one")
      return system.actorOf(Props[RC], id:String)
    }else{
      return a
    }
   }

Но это не работает, поскольку isTerminatedвсегда верно, и я получаю Имя актера 1 не уникально! исключение для второго вызова. Я думаю, что здесь я использую неправильный шаблон. Может ли кто-нибудь помочь, как этого добиться? Мне нужно

  • Создание актеров по запросу
  • Поиск актеров по идентификатору а если нет, то создайте их
  • Возможность уничтожить дальше, так как я не знаю, понадобится ли мне это снова

Должен ли я использовать для этого Диспетчер или Маршрутизатор?

Решение Как было предложено, я использую конкретный супервизор, который содержит доступных актеров на карте. Можно попросить предоставить одного из его детей.

class RCSupervisor extends Actor {

  implicit val timeout = Timeout(1 second)
  var as = Map.empty[String, ActorRef]

  def getRCActor(id: String) = as get id getOrElse {
    val c = context actorOf Props[RC]
    as += id -> c
    context watch c
    Logger.info("created actor")
    c
  }

  def receive = {

    case Find(id) => {
      sender ! getRCActor(id)
    }

    case Terminated(ref) => {
      Logger.info("actor terminated")
      as = as filterNot { case (_, v) => v == ref }
    }
  }
}

Его сопутствующий объект

object RCSupervisor {

  // this is specific to Playframework (Play's default actor system)
  var supervisor = Akka.system.actorOf(Props[RCSupervisor])

  implicit val timeout = Timeout(1 second)

  def findA(id: String): ActorRef = {
    val f = (supervisor ? Find(id))
    Await.result(f, timeout.duration).asInstanceOf[ActorRef]
  }
  ...
}
23
задан martin 27 May 2012 в 18:46
поделиться