在Akka中,您可以在构造函数中初始化actor的状态。此外,作为actor生命周期的一部分,preStart可以重写此方法以初始化actor的状态,并将其称为:
postRestart被覆盖以不调用它两种方式(构造函数和preStart)似乎覆盖了参与者启动阶段的重叠阶段,但有一点细微的差别,即保证可以在重新启动时调用构造函数preStart,但是只要您重写,就可以跳过构造函数postRestart。
在这种情况下,是否存在关于使用哪种最佳实践或模式的公认或书面记录?
使用构造函数进行初始化有很多好处。首先,它使得可以使用
val字段来存储在actor实例的生命周期内任何不变的状态,从而使actor的实现更加可靠。创建actor实例时调用构造函数actorOf,并在重新启动时调用,因此actor的内部始终可以假定发生了正确的初始化。
从通过preStart初始化的文档中:
preStart()actor 的方法仅在第一个实例初始化期间直接调用一次,即在其实例创建时直接调用一次ActorRef。在重新启动的情况下,preStart()从调用postRestart(),因此,如果不被覆盖,preStart()则在每次重新启动时都被调用。但是,通过覆盖postRestart()可以禁用此行为,并确保只有一个调用preStart()。此模式的一种有用用法是
ActorRefs在重新启动过程中禁止为子代创建new 。这可以通过覆盖实现preRestart()。
如果希望每次实例化actor时都进行初始化(包括重新启动:在重新启动时,将创建基础actor的新实例),请通过构造函数使用初始化。此示例场景是在创建参与者时使用不变状态。
如果希望仅在创建actor的第一个实例时才进行初始化,请使用通过preStart和覆盖postRestart进行初始化以不进行调用preStart。此示例用例是在重新启动后保留子actor(默认情况下,preRestart停止actor的子代,这就是为什么文档中提到preRestart此示例用例覆盖的原因)。