代码之家  ›  专栏  ›  技术社区  ›  stefanobaghino

构造器与预启动:何时使用哪个?

  •  3
  • stefanobaghino  · 技术社区  · 6 年前

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

    • 当参与者第一次启动时,在开始处理其第一条消息之前
    • 当演员重新开始时, 除非 postRestart 被重写为不调用它

    两种方式(构造函数和 启动前 )似乎覆盖了actor启动阶段的重叠阶段,而构造函数 放心 重新启动时调用,而 启动前 可以跳过,前提是重写 重启后 .

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

    1 回复  |  直到 6 年前
        1
  •  8
  •   Jeffrey Chung    6 年前

    从上的文档 initialization via constructor :

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

    从上的文档 initialization via preStart :

    方法 preStart() 在第一个实例的初始化期间(即在创建 ActorRef . 在重启的情况下, 启动前() 是从 postRestart() ,因此,如果不重写, 启动前() 每次重新启动时调用。但是,通过重写 重新启动后() 可以禁用此行为,并确保只有一个调用 启动前() .

    此模式的一个有用用法是禁用 ActorRefs 对于重新启动期间的孩子。这可以通过覆盖 preRestart() .

    如果要初始化 每次一个参与者被实例化 (包括重新启动:重新启动时,将创建底层参与者的新实例),通过构造函数使用初始化。这方面的示例场景是每当创建参与者时使用不变状态。

    如果要初始化 只有当参与者的第一个实例被创建时 ,使用初始化通过 preStart 和覆盖 postRestart 不打电话 启动前 . 这方面的示例用例是跨重新启动保存子参与者(默认情况下, preRestart 停止参与者的子级,这就是为什么文档中提到重写 预重启 对于本例用例)。