scala – 按需演员获取或创建
发布时间:2020-12-16 09:42:40 所属栏目:安全 来源:网络整理
导读:我可以用actorOf创建演员,并用actorFor来查看。我现在想通过一些id获得一个actor:String,如果它不存在,我希望它被创建。这样的事情 def getRCActor(id: String):ActorRef = { Logger.info("getting actor %s".format(id)) var a = system.actorFor(id) i
我可以用actorOf创建演员,并用actorFor来查看。我现在想通过一些id获得一个actor: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 } } 但是这不起作用,因为终止始终是真实的,我得到演员姓名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] } ... } 解决方法
我没有一直在使用akka,但是演员的创作者默认是他们的主管。因此,父母可以听取他们的终止;
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 c } 但显然你需要注意终止; def receive = { case Terminated(ref) => as = as filterNot { case (_,v) => v == ref } 这是一个解决方案吗?我必须说我完全不明白你的意思是“终止始终是真的=>演员姓名1不是唯一的! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |