akka 文档清楚地表明在这样的actor中创建一个actor很危险:
class ActorA extends Actor {
def receive = ???
}
final class ActorB extends Actor {
def receive = {
case _ =>
val act = context.actorOf(Props(new ActorA))
}}
Run Code Online (Sandbox Code Playgroud)
据我所知,Actor的apply方法是接受this
创建actor的引用.但我无法理解(也找不到任何例子)为什么这有害以及它可能导致什么问题?
让我们稍微调整一下你的例子
class ActorA(str:String) extends Actor {
def receive = ???
}
final class ActorB extends Actor {
def receive = {
case _ =>
val act = context.actorOf(Props(new ActorA("hidden")))
}}
Run Code Online (Sandbox Code Playgroud)
使用 Actor 的大多数常见用例都是处理故障转移和监督,当 Actor 发生故障并需要重新启动时,Actor 系统需要知道如何执行此操作。当你使用Props(Props(new ActorA))时,你已经通过自己处理隐藏了“hidden”的参数值。
相反,如果您声明如何创建 Actor 的实例,则 Actor 系统将确切地知道在重新创建 Actor 时需要做什么,而不是这样做 - 即使用构造函数参数“hidden”创建 ActorA 的实例。
即使你的 Actor 示例没有参数
context.actorOf(Props(new ActorA))
Run Code Online (Sandbox Code Playgroud)
不建议使用这种在另一个 Actor 中实例化 Actor 的方式,因为它会鼓励关闭封闭范围,从而导致不可序列化的 Props 和可能的竞争条件(破坏 Actor 封装)。
归档时间: |
|
查看次数: |
370 次 |
最近记录: |