>我正在 Play 2.3.7 中编写一个应用程序,当尝试在 Global
对象的 beforeStart
覆盖方法内创建一个 actor(使用 Play 的默认Akka.system()
)时,应用程序崩溃并带有一些无限递归的 beforeStart
调用,最终由于对象未初始化而引发异常Global
。如果我在 onStart
方法中创建这个 actor,那么一切都很顺利。
我的"直觉"是:"好的,这个actor必须在应用程序收到第一个请求之前准备好,所以它必须在beforeStart
上创建,而不是在onStart
中创建"。
Akka.system()
什么时候可以使用?
Akka.system
返回由AkkaPlugin
持有的ActorSystem
。因此,如果要使用它,则必须在初始化AkkaPlugin
后执行此操作。 AkkaPlugin
的优先级为 1000,这意味着它在大多数其他内部插件(数据库、演变等)之后启动。Global
插件的优先级为 10000,这意味着AkkaPlugin
在那里可用(对于优先级> 1000 的任何插件)。
请注意文档中有关beforeStart
的警告:
在应用程序启动之前调用。
由插件管理的资源(如数据库连接)此时可能不可用。
您必须在onStart()
中启动它,因为调用beforeStart()
太早了 - 在创建诸如Akka(实际上是一个插件)或任何数据库连接之前。事实上,GlobalSettings
的文档指出:
由插件管理的资源(如数据库连接)此时可能不可用。
一般指导(由此线程确认)是onStart()
是创建演员的地方。在实践中,这对我也有用。