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

a.m*_*ssa 1 scala akka

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

context.system.actorOf(Props[B], "B")
Run Code Online (Sandbox Code Playgroud)

我得到一个例外:

InvalidActorNameException: actor name [B] is not unique!
Run Code Online (Sandbox Code Playgroud)

你知道为什么会这样吗?

Jef*_*ung 6

Actor路径(其中一部分是您传递给的名称,system.actorOf或者context.actorOf,如果您使用其actorOf名称的变体,则必须在actor系统中是唯一的).您可能向演员A发送了多条消息:每次演员A收到此消息时,它都会尝试创建一个名为"B"的顶级演员B. 要么完全放弃这个名字......

context.system.actorOf(Props[B])
Run Code Online (Sandbox Code Playgroud)

...或者为名称添加唯一标识符.例如:

val uuid = java.util.UUID.randomUUID.toString
context.system.actorOf(Props[B], s"B-${uuid}")
Run Code Online (Sandbox Code Playgroud)

作为旁注system.actorOf,正如文档所建议的那样,应该谨慎地制作顶级演员(即通过演员创建的演员):

顶级角色是错误内核的最内层部分,因此请谨慎创建它们,而不是真正的分层系统.这有利于故障处理(既考虑配置的粒度和性能),也减少了监护人的压力,如果过度使用则是单点争用.

如果您的意图是每次后者收到消息时将actor B创建为actor A的子节点,那么请使用context.actorOf.