Akka文档说明了道具:
在另一个演员中声明一个演员是非常危险的并打破演员 封装。永远不要将演员的这个引用传递给道具!
为什么system.actorOf(Props(new SellActor(100)),"new_actor")
被认为是错误的?
我经历了Akka Actor Props factory和article,但我仍然无法理解错误是什么。即使我传递了引用,我的代码运行正常。你能给出一个显示问题的小代码示例吗?
更新:从给出的答案中我理解了它与演员生活方式的相关性。但是如果我没有任何参数传递给Actor对象怎么办呢。例如,
system.actorOf(Props(new SellActor()),"new_actor")
也被认为是一种不好的做法。如果我们在另一个中创建一个actor对象会有什么问题?
答案 0 :(得分:1)
当演员失败并需要重新启动时,演员系统需要知道如何做到这一点。当您使用Props(new SellActor(100)
时,您已自行隐藏了100
的参数值。
相反,如果您声明如何来创建actor的实例,则actor系统将在重新创建actor时确切知道它需要做什么 - 即创建SellActor
的实例使用100
的构造函数参数。
即使您没有参数,也会引入一些潜在的重大问题。来自documentation:
// NOT RECOMMENDED within another actor:
// encourages to close over enclosing class
val props7 = Props(new MyActor)
不建议在另一个actor中使用此方法,因为它鼓励关闭封闭范围,导致不可序列化的Props和可能的竞争条件(打破actor封装)。