每个请求创建actor的最佳实践

时间:2015-05-10 20:30:16

标签: scala akka spray

我想实现我正在看这个从类型安全激活器中获取的示例(每个请求的喷射演员)

class RestRouting extends HttpService with Actor with PerRequestCreator {

implicit def actorRefFactory: ActorContext = context

def receive = runRoute(route)

val petService = context.actorOf(Props[PetClient])
val ownerService = context.actorOf(Props[OwnerClient])

val route = {
 get {
   path("pets") {
          parameters('names) { names =>
    petsWithOwner {
           GetPetsWithOwners(names.split(',').toList)
     }
   }
  }
 }
}

def petsWithOwner(message : RestMessage): Route =
ctx => perRequest(ctx, Props(new GetPetsWithOwnersActor(petService, ownerService)), message)
}

我想知道这是否是实施演员创作的最佳选择:

ctx => perRequest(ctx, Props(new GetPetsWithOwnersActor(petService, ownerService)), message)

因为我在akka文档中看到了关于在actor中创建actor的警告:

val props2 = Props(new ActorWithArgs("arg")) // careful, see below

如果我们在演员中定义一个演员

val ownerService = context.actorOf(Props[OwnerClient])

如何测试?

只是为了说清楚 - 我并不批评,我只是试图学习实施的最佳实践,特别是当我看到类型安全激活器作为教育来源

1 个答案:

答案 0 :(得分:0)

演员被安排在一个从ActorSystem的根开始的hieararchy中。对于大多数甚至是中等复杂的项目,所有参与者都不会在该根创建,但是一些参与者将监督其他参与者,从而创建它们。可以使用Akka TestKit测试这样的子actor,它扩展了ActorSytem以创建一个测试ActorSystem,它可以替代给定的父actor,并提供对其子代的访问以进行测试。例如,#Ak; Concurrency"作者:Derek Wyatt。具体来说,本书有一个平面模拟,其中一个Plane actor创建了Pilot和CoPilot actor,它们使用TestKit和ScalaTest进行了测试,如https://github.com/danluu/akka-concurrency-wyatt/blob/master/src/test/scala/PilotsSpec.scala所示。为了做到这一点,TestKit取代了Plane并创建了Pilot和CoPilot actor作为其子项。这可能部分是因为Pilot和CoPilot不知道是谁或是什么创造了它们。有关参考,请参阅平面如何在https://github.com/danluu/akka-concurrency-wyatt/blob/master/src/main/scala/Plane.scala中创建它们。整个项目都有效,并提供了许多Akka使用的优秀示例。它可以使用一些更新来删除折旧,当使用更新版本的scala编译时,有必要将scala.concurrent.util.duration更正为scala.concurrent.duration。