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需要成为一个类(而不是一个对象),因此不再是单例.
从这里:
创建这样一个注册表有一张票,但是当我们尝试详细指定语义时,我们对得到的内容不满意。其中一部分是,我们删除了所有全局状态,以便应用程序的不同部分可以使用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)
| 归档时间: |
|
| 查看次数: |
4009 次 |
| 最近记录: |