我想实现我正在看这个从类型安全激活器中获取的示例(每个请求的喷射演员)
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])
如何测试?
只是为了说清楚 - 我并不批评,我只是试图学习实施的最佳实践,特别是当我看到类型安全激活器作为教育来源
答案 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。