在另一个演员中创建Akka演员

时间:2018-02-07 13:34:33

标签: scala akka

我创建了一个actor A.当我向A发送消息时,receive方法尝试创建一个actor B.当我运行一段调用的代码时:

context.system.actorOf(Props[B], "B")

我得到一个例外:

InvalidActorNameException: actor name [B] is not unique!

你知道为什么会这样吗?

1 个答案:

答案 0 :(得分:6)

Actor paths(其中一部分是您传递给system.actorOfcontext.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