如果我们传递对道具的引用有什么问题?

时间:2016-12-19 04:34:06

标签: scala akka

Akka文档说明了道具:

  

在另一个演员中声明一个演员是非常危险的并打破演员   封装。永远不要将演员的这个引用传递给道具!

为什么system.actorOf(Props(new SellActor(100)),"new_actor")被认为是错误的?

我经历了Akka Actor Props factoryarticle,但我仍然无法理解错误是什么。即使我传递了引用,我的代码运行正常。你能给出一个显示问题的小代码示例吗?

更新:从给出的答案中我理解了它与演员生活方式的相关性。但是如果我没有任何参数传递给Actor对象怎么办呢。例如,

system.actorOf(Props(new SellActor()),"new_actor")

也被认为是一种不好的做法。如果我们在另一个中创建一个actor对象会有什么问题?

1 个答案:

答案 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封装)。