我可以用 来创建演员actorOf
并用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
往常一样actor name 1 is not unique!
有效,第二次通话我得到了例外。我想我在这里使用了错误的模式。有人可以帮助如何实现这一目标吗?我需要
- 按需创建演员
- 按 id 查找演员,如果不存在则创建他们
- 破坏能力,因为我不知道我是否会再次需要它
我应该为此使用调度程序还是路由器?
解决方案 正如建议的那样,我使用了一个具体的主管,它将可用的参与者保存在地图中。可以要求提供他的一个孩子。
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]
}
...
}