在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的状态,并将其称为:
preStart
被覆盖为不调用它这两种方式(构造函数和postRestart
)似乎覆盖了参与者启动阶段的重叠阶段,但稍有不同之处在于,保证可以在重新启动时调用构造函数,而{如果您覆盖preStart
,则可以跳过{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
的原因)。