我创建一个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)
你知道为什么会这样吗?
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.
| 归档时间: |
|
| 查看次数: |
621 次 |
| 最近记录: |