2015-01-06 92 views
1

我在Play 2.3.7上写了一个应用程序,当试图在Global对象的beforeStart重写方法内创建一个actor(使用Play的默认Akka.system())时,该应用程序崩溃,并且发生了一些无限递归调用beforeStart,最终抛出由于Global对象未被初始化而导致例外。如果我在onStart方法中创建这个actor,那么一切都会顺利。Akka的Play默认系统何时准备就绪?

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

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

回答

2

Akka.system返回由AkkaPlugin持有的ActorSystem。因此,如果要使用它,则必须在AkkaPlugin初始化后执行此操作。 AkkaPlugin优先1000,这意味着它在大多数其他内部插件(数据库,演变,..)之后开始。 Global插件的优先级为10000,这意味着AkkaPlugin可用(对于任何优先级> 1000的插件)。

备注beforeStart在文档警告:

应用程序启动之前调用。

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

2

您必须从onStart()开始,因为beforeStart()被称为过早 - 在像Akka(实际上是一个插件)或任何数据库连接创建之前的任何方式。实际上,the documentation for GlobalSettings states

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

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