构造函数与preStart:什么时候使用?

时间:2018-07-26 12:05:53

标签: akka

在Akka中,您可以在构造函数中初始化actor的状态。此外,作为actor生命周期的一部分,可以重写Loading failed for the <script> with source “http://myproject.herokuapp.com/static/cms_modules/ckeditor/config.js?t=G87E”. config:1 Loading failed for the <script> with source “http://myproject.herokuapp.com/static/cms_modules/ckeditor/skins/moonocolor/skin.js?t=G87E”. config:1 Loading failed for the <script> with source “http://myproject.herokuapp.com/static/cms_modules/ckeditor/lang/en.js?t=G87E”. config:1 TypeError: c[a] is undefined方法以初始化actor的状态,并将其称为:

  • 演员首次启动时,开始处理其第一条消息之前
  • 重新启动actor时,除非 preStart被覆盖为不调用它

这两种方式(构造函数和postRestart)似乎覆盖了参与者启动阶段的重叠阶段,但稍有不同之处在于,保证可以在重新启动时调用构造函数,而{如果您覆盖preStart,则可以跳过{1}}。

在这种情况下,是否有公认的或记录的最佳做法或模式?

1 个答案:

答案 0 :(得分:5)

摘自initialization via constructor上的文档:

  

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

摘自initialization via preStart上的文档:

  

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

     

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

如果希望每次实例化actor时进行初始化(包括重新启动:在重新启动时,将创建基础actor的新实例),请通过构造函数使用初始化。这种情况的示例场景是每当创建角色时都使用不变状态。

如果您希望初始化仅在创建actor的第一个实例时发生,请通过preStart使用初始化并覆盖postRestart以不调用preStart 。此示例用例是在重新启动后保留子actor(默认情况下,preRestart停止了actor的孩子,这就是为什么文档中提到此示例用例覆盖preRestart的原因)。