我可以创建演员,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
}
}
Run Code Online (Sandbox Code Playgroud)
但这并不isTerminated总是如此,我得到actor name 1 is not unique!了第二次调用的异常.我想我在这里使用了错误的模式.有人可以帮助如何实现这一目标吗?我需要
我应该使用Dispatcher或Router吗?
解决方案 如我所建议的,我使用一个具体的Supervisor来保存地图中可用的actor.可以要求他提供他的一个孩子.
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 }
}
}
}
Run Code Online (Sandbox Code Playgroud)
他的同伴对象
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]
}
...
}
Run Code Online (Sandbox Code Playgroud)
oxb*_*kes 14
我没有长时间使用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
}
Run Code Online (Sandbox Code Playgroud)
但显然你需要注意他们的终止;
def receive = {
case Terminated(ref) => as = as filterNot { case (_, v) => v == ref }
Run Code Online (Sandbox Code Playgroud)
这是一个解决方案吗?我必须说我并不完全理解你所说的"终止总是如此=>演员姓名1并不是唯一的!"
Rol*_*uhn 13
演员只能由他们的父级创建,并且从您的描述中我假设您正在尝试让系统创建一个非顶级演员,这将永远失败.你应该做的是向家长发送一条消息"在这里给我这个孩子",然后父母可以检查当前是否存在,健康状况良好等,可能创建一个新的,然后用适当的方式回复结果消息.
重申这个非常重要的观点:get-or-create只能由直接父母完成.
| 归档时间: |
|
| 查看次数: |
6042 次 |
| 最近记录: |