akka documentation明确指出,在像这样的actor中创建actor是危险的:
class ActorA extends Actor {
def receive = ???
}
final class ActorB extends Actor {
def receive = {
case _ =>
val act = context.actorOf(Props(new ActorA))
}}
我知道Actor的apply方法正在接受创建actor的
this
引用。但我不明白(也找不到任何示例)为什么这样做有害,并且可能导致什么问题? 最佳答案
让我们稍微调整一下您的示例
class ActorA(str:String) extends Actor {
def receive = ???
}
final class ActorB extends Actor {
def receive = {
case _ =>
val act = context.actorOf(Props(new ActorA("hidden")))
}}
使用actor的大多数常见用例是处理故障转移和监督,如果actor发生故障并且需要重新启动,那么actor系统需要知道如何执行此操作。使用Props(Props(new ActorA))时,您已经通过自己处理隐藏了“hidden”的参数值。
如果声明如何创建actor实例,而不是这样做,那么actor系统将确切地知道在重新创建actor时需要执行的操作-
也就是说,使用构造函数参数“隐藏”创建ActorA的实例。
即使您的 Actor 实例没有参数
context.actorOf(Props(new ActorA))
不建议以这种方式实例化另一个actor中的actor,因为它鼓励关闭封闭范围,从而导致不可序列化的Props以及可能的竞赛条件(破坏actor的封装)。