Akka 构造函数与预启动:何时使用哪个?

Akka 构造函数与预启动:何时使用哪个?,akka,Akka,在Akka中,您可以在构造函数中初始化参与者的状态。此外,作为参与者生命周期的一部分,preStart方法可以被重写以初始化参与者的状态,并将被调用: 参与者首次启动时,在开始处理其第一条消息之前 重新启动参与者时,除非重写postreast以不调用它 这两种方法(构造函数和预启动)似乎涵盖了参与者启动阶段的重叠阶段,但略有不同的是,构造函数保证在重新启动时被调用,而预启动可以跳过,前提是覆盖后重新启动 关于在哪种情况下使用哪种方法,是否有公认的或记录在案的最佳实践或模式?来自以下文档: 使

在Akka中,您可以在构造函数中初始化参与者的状态。此外,作为参与者生命周期的一部分,
preStart
方法可以被重写以初始化参与者的状态,并将被调用:

  • 参与者首次启动时,在开始处理其第一条消息之前
  • 重新启动参与者时,除非重写
    postreast
    以不调用它
这两种方法(构造函数和
预启动
)似乎涵盖了参与者启动阶段的重叠阶段,但略有不同的是,构造函数保证在重新启动时被调用,而
预启动
可以跳过,前提是覆盖
后重新启动

关于在哪种情况下使用哪种方法,是否有公认的或记录在案的最佳实践或模式?

来自以下文档:

使用构造函数进行初始化有各种好处。首先,它可以使用
val
字段来存储在actor实例生命周期内不会更改的任何状态,从而使actor的实现更加健壮。构造函数在调用
actorOf
创建actor实例时调用,也在重新启动时调用,因此actor的内部可以始终假定发生了正确的初始化

从以下文件:

在第一个实例初始化期间,即在创建其
ActorRef
时,仅直接调用一次actor的方法
preStart()
。在重新启动的情况下,从
postreast()
调用
preStart()
,因此,如果未被重写,则每次重新启动时都会调用
preStart()
。但是,通过重写
postreast()
可以禁用此行为,并确保只有一个调用
preStart()

此模式的一个有用用法是在重新启动期间禁用为子级创建新的
ActorRefs
。这可以通过重写
preRestart()
来实现

如果希望每次实例化某个参与者时都进行初始化(包括重新启动:重新启动时,将创建基础参与者的新实例),请通过构造函数使用初始化。这方面的示例场景是在创建参与者时使用不变状态


如果希望仅在创建参与者的第一个实例时进行初始化,请通过
preStart
使用初始化,并覆盖
postreast
以不调用
preStart
。这方面的示例用例是在重启过程中保留子参与者(默认情况下,
preRestart
会停止参与者的子参与者,这就是为什么文档提到在这个示例用例中覆盖
preRestart

Ha,在询问之前,我对文档的了解还不够深入。谢谢首先,谢谢你的回答:-)但我还有一个问题。假设我使用不停止子对象的方法,以避免触发新ActorRefs的生成。重新启动后,演员如何知道孩子们的ActorRefs?重新启动的参与者是从头开始创建的,没有旧停止实例的任何状态。它怎么能算出孩子们的演员名单呢?