Akka 的默认系统何时在 Play 中准备就绪?

When is Akka's default system ready in Play?

我在 Play 2.3.7 中编写了一个应用程序,当我试图在 GlobalbeforeStart 覆盖方法中创建一个 actor(使用 Play 的默认 Akka.system())时对象,应用程序因 beforeStart 的无限递归调用而崩溃,最终由于 Global 对象未初始化而引发异常。如果我在 onStart 方法中创建这个 actor,那么一切都会顺利。

我的 "intuition" 是:"ok, this actor must be ready before the application receives the first request, so it must be created on beforeStart, not in onStart".

Akka.system()什么时候可以使用?

你必须在 onStart() 开始这个,因为 beforeStart() 被调用得太早了 - 在任何像 Akka(它实际上是一个插件)或任何数据库连接被创建之前。事实上,the documentation for GlobalSettings states:

Resources managed by plugins, such as database connections, are likely not available at this point.

一般指导 (confirmed by this thread) onStart() 是创建演员的地方。在实践中,这对我也很有效。

Akka.system returns ActorSystemAkkaPlugin 持有。因此,如果要使用它,必须在 AkkaPlugin 初始化之后使用。 AkkaPlugin 的优先级为 1000,这意味着它在大多数其他内部插件(数据库、演变等)之后启动。 Global 插件的优先级为 10000,这意味着 AkkaPlugin 在那里可用(以及任何优先级 > 1000 的插件)。

注意文档中关于 beforeStart 的警告:

Called before the application starts.

Resources managed by plugins, such as database connections, are likely not available at this point.