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

时间:2015-01-06 03:18:48

标签: akka playframework-2.3

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

我的直觉"是:"好的,这个演员必须在应用程序收到第一个请求之前就绪,所以它必须在beforeStart上创建,而不是在onStart"

Akka.system()何时可以使用?

2 个答案:

答案 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的文档中的警告:

  

在应用程序启动之前调用。

     

由插件管理的资源(例如数据库连接)此时可能不可用。