我创建了一个actor A.当我向A发送消息时,receive
方法尝试创建一个actor B.当我运行一段调用的代码时:
context.system.actorOf(Props[B], "B")
我得到一个例外:
InvalidActorNameException: actor name [B] is not unique!
你知道为什么会这样吗?
答案 0 :(得分:6)
Actor paths(其中一部分是您传递给system.actorOf
或context.actorOf
的名称,如果您使用带有名称的actorOf
变体)必须是唯一的在演员系统中。您可能向演员A发送了多条消息:每次演员A收到此消息时,它都会尝试创建一个名为“B”的顶级演员B.要么完全放弃这个名字......
context.system.actorOf(Props[B])
...或为名称添加唯一标识符。例如:
val uuid = java.util.UUID.randomUUID.toString
context.system.actorOf(Props[B], s"B-${uuid}")
作为附注,顶级演员(即通过system.actorOf
创建的演员)应该谨慎制作,documentation建议:
顶层角色是您的错误内核的最内层部分,因此请谨慎创建它们,而不是真正的分层系统。这有利于故障处理(既考虑配置的粒度和性能),也减少了监护人的压力,如果过度使用则是单点争用。
如果你的意图是每次后者收到消息时都将演员B创建为演员A的孩子,那么使用context.actorOf
。