是否可以在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需要成为一个类(不是对象),所以不再是单例。
答案 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) = {...}
}