在另一个actor中创建Akka actor

Posted

技术标签:

【中文标题】在另一个actor中创建Akka actor【英文标题】:Create Akka actor in another actor 【发布时间】:2018-07-17 19:48:43 【问题描述】:

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

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

我得到一个例外:

InvalidActorNameException: actor name [B] is not unique!

你知道为什么会这样吗?

【问题讨论】:

【参考方案1】:

Actor paths(其中一部分是您传递给system.actorOfcontext.actorOf 的名称,如果您使用带有名称的actorOf 的变体)在actor 系统中必须是唯一的。您可能向演员 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 所建议的那样:

***参与者是错误内核的最内部部分,因此请谨慎创建它们并更喜欢真正的分层系统。这有利于故障处理(考虑到配置的粒度和性能),并且还减少了监护参与者的压力,如果过度使用,这将成为单点争用。

如果您的意图是在每次演员 A 收到消息时创建一个演员 B 作为演员 A 的孩子,那么请使用 context.actorOf

【讨论】:

以上是关于在另一个actor中创建Akka actor的主要内容,如果未能解决你的问题,请参考以下文章

Akka系列:Akka中的Actor系统

二 Akka学习 - actor介绍

为啥在actor中创建actor是危险的

一 Akka学习 - actor

Erlang VS Akka- Actor模型介绍

akka设计模式系列-actor锚定