我在Play 2.3.7中编写了一个应用程序,并尝试在Akka.system()
对象的beforeStart
覆盖方法中创建一个actor(使用Play的默认Global
),应用程序因beforeStart
的无限递归调用而崩溃,最终由于Global
对象未被初始化而抛出异常。如果我在onStart
方法中创建这个actor,那么一切顺利。
我的直觉"是:"好的,这个演员必须在应用程序收到第一个请求之前就绪,所以它必须在beforeStart
上创建,而不是在onStart
"
Akka.system()
何时可以使用?
答案 0 :(得分:2)
你必须在onStart()
中启动它,因为beforeStart()
被过早调用 - 比之前像Akka(实际上是一个插件)或任何数据库连接被创建。事实上,the documentation for GlobalSettings
states:
由插件管理的资源(例如数据库连接)此时可能不可用。
一般指导(confirmed by this thread)是onStart()
是创建演员的地方。在实践中,这对我也有用。
答案 1 :(得分:2)
Akka.system
会返回ActorSystem
所持有的AkkaPlugin
。因此,如果要使用它,则必须在初始化AkkaPlugin
后执行此操作。 AkkaPlugin
优先级为1000,这意味着它在大多数其他内部插件(数据库,演变,...)之后启动。 Global
插件的优先级为10000,这意味着AkkaPlugin
可用(对于任何优先级大于1000的插件)。
请注意有关beforeStart
的文档中的警告:
在应用程序启动之前调用。
由插件管理的资源(例如数据库连接)此时可能不可用。