でアクターを作成し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!
、2回目の呼び出しで例外が発生します。ここでは間違ったパターンを使用していると思います。誰かがこれを達成する方法を助けることができますか?私は欲しい
- オンデマンドでアクターを作成する
- IDでアクターを検索し、存在しない場合は作成します
- もう一度必要かどうかわからないので、破壊する能力
これにはディスパッチャーまたはルーターを使用する必要がありますか?
解決策 提案されているように、マップで使用可能なアクターを保持する具体的なスーパーバイザーを使用します。彼の子供のうちの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]
}
...
}