如何获取Akka中现有ActorSystem的引用?

Ehu*_*dor 9 scala actor akka spray

是否有可能在Akka(scala)中获得对现有ActorSystem的引用?

我正在与另一个DB的Actor一起开发Spray应用程序.我也在扩展Directives以获得每个路径的对象.指令本身不是actor,但是它们需要将消息传递给DBActor.这里:

class HttpActor extends Actor with HttpService {

  val actorRefFactory = context

  def receive = runRoute(
    IndexService.route ~ 
    HostsService.route    
  )
}

object HostsService extends Directives{
  def route(implicit dm: DetachMagnet2) = {
    path("hosts") {
      get {  
        detach() {
          **dbActor ! CreateHost** 
          complete("get me hosts!")
        }
      } ~
      post {
        detach() {
          entity(as[String]) { payload =>
            complete(s"post hosts $payload")     
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让HostsService发现ActorSystem本身,这样他就可以找到DBActor,或者HttpActor是否必须将其传入?后者似乎不太优雅,因为HostsService需要成为一个类(而不是一个对象),因此不再是单例.

dk1*_*k14 5

这里

创建这样一个注册表有一张票,但是当我们尝试详细指定语义时,我们对得到的内容不满意。其中一部分是,我们删除了所有全局状态,以便应用程序的不同部分可以使用Akka而不用担心彼此,全局功能会破坏这一点。另一个是它会鼓励使用或创建用法(我的宠儿),这会使语义不清楚:您提供一个名称和一个配置,但是如果该名称已经存在,则可能会得到一个配置不同的系统(通常是相当致命)。

没有什么能阻止您将哈希图放置在应用程序的中心位置,使用所需的actor系统(预先)填充该哈希图,这基本上是单行的(这是不在Akka中包含它的另一个原因,因为除了解决一个非常狭窄的问题的简单解决方案之外,我们还必须考虑解决一个更通用的问题的解决方案)

在您的情况下,最好将系统隐式传递给该route函数:

class HttpActor extends Actor with HttpService {

  implicit val actorRefFactory = context

  def receive = runRoute(
    IndexService.route ~ 
    HostsService.route    
  )
}

object HostsService extends Directives {
  def route(implicit dm: DetachMagnet2, as: ActorContext) = {...}
}
Run Code Online (Sandbox Code Playgroud)