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



>我正在 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()是创建演员的地方。在实践中,这对我也有用。

最新更新