如何访问通过 guice 创建的 akka 系统?

Posted

技术标签:

【中文标题】如何访问通过 guice 创建的 akka 系统?【英文标题】:How to gain access to the akka system created via guice? 【发布时间】:2015-09-21 19:15:31 【问题描述】:

所以我在这里遵循模板: https://github.com/rocketraman/activator-akka-scala-guice#master

我已将此代码移植到 2.4 版 Play 应用中。

现在我可以创建演员系统并在 Global 类中创建演员并将初始消息发送给演员。我还设置了尝试与某些演员交谈并获得状态的路线,但我无法访问,因为我无法访问原始演员系统。

我怎样才能做到这一点?我认为在较旧的 Play 版本中,我们有 getControllerInstance;用于以下情况:

  /**
   * Controllers must be resolved through the application context. There is a special method of GlobalSettings
   * that we can override to resolve a given controller. This resolution is required by the Play router.
   */
  override def getControllerInstance[A](controllerClass: Class[A]): A = injector.getInstance(controllerClass)

由此,我们可以在控制器中注入某些依赖项。既然这被删除了,我们就不能再这样做了。有没有办法解决这个问题?

【问题讨论】:

我有点困惑。为什么要创建一个新的 Akka 系统? Play 已经包含一个,您可以通过Akka.system() 访问它。 【参考方案1】:

It's pretty clear how to inject Akka system in to the controller

import play.api.mvc._
import akka.actor._
import javax.inject._

import actors.HelloActor

@Singleton
class Application @Inject() (system: ActorSystem) extends Controller 

  val helloActor = system.actorOf(HelloActor.props, "hello-actor")

  //...

注意@Singleton这里只是存储对actor的引用-而不是ActorSystem,it's handled by the Play in backend

Play 应用程序定义了一个特殊的 Actor 系统,供 应用。该参与者系统遵循应用程序生命周期和 应用程序重新启动时自动重新启动。

【讨论】:

以上是关于如何访问通过 guice 创建的 akka 系统?的主要内容,如果未能解决你的问题,请参考以下文章

访问由 Source.actorRef 创建的 akka 流 Source 的底层 ActorRef

如何使用Guice注射器创建对象?

当他们的构造函数参数被依赖注入时如何实例化子演员?

Akka中使用Logback日志框架

如何在 Scala Akka 中停止 system.scheduler.schedule

如何使用 Guice 在 Spring JDBC 中使用事务