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

时间:2015-02-08 22:12:55

标签: scala akka actor 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")     
          }
        }
      }
    }
  }
}

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

1 个答案:

答案 0 :(得分:4)

来自here

  

有一张创建这样一个注册表的票,但我们没有   对我们在尝试指定语义时得到的内容感到满意   详情。一部分是我们删除了所有全局状态以使其不同   应用程序的某些部分可以使用Akka而不必担心   彼此和全局特征将打破这一点。另一个是它   会鼓励获取或创造使用 - 我的宠物小便 - 这将成为   语义不清楚:你给出一个名字和一个配置,但如果名字   已经存在,你可能会得到不同的配置   系统(通常非常致命)。

     

没有什么可以阻止你在一些中心放置一个hashmap   应用程序的位置,(pre-)用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) = {...}
}