所以这个问题与我的一个旧问题有关:我是否需要重新使用相同的 Akka ActorSystem 或者我可以在每次需要时创建一个?
我问了一个关于演员生命周期的问题,我知道我的想法有问题,但无法正确表达。希望我现在可以:-)。
这是情况。我想测试依赖于其他组件和演员的演员,所以我开始在引导时间组合我的演员(我正在使用 scalatra,但是你引导你的应用程序)。因此,我有这样的事情:
trait DependencyComponent
{
val dependency : Dependency
}
trait ActorComponentA extends Actor with DependencyComponent {
val actorB : ActorRef
}
trait ActorComponentB extends Actor with DependencyComponent
好的,现在我可以通过扩展特征和提供模拟依赖来测试我的演员,一切都很好。我可以像这样引导我的应用程序:
引导程序
val system = ActorSystem()
val actorA = system.actorOf(Props[DefaultActorA])
class DefaultActorB extends ActorComponentB {
val dependency = new RealDependency()
}
class DefaultActorA extends ActorComponentA {
val dependency = new RealDependency()
val actorB = context.actorOf(Props[DefaultActorB]).withRouter(RoundRobinRouter(nrOfInstances = 100)))
}
很酷,我很高兴 :-),现在我可以在我的应用程序中使用 actorSystem 和 actorA,它有 100 个 actorB 路由以传递工作。所以当actorA决定工作完成时,我的理解是它应该广播给路由的actors以关闭。此时,当另一个请求进入时,actorA 不能再向路由器发送消息,因为它的所有参与者都已死亡。
如果我没有在启动时设置它,那么可以在我的应用程序中需要时创建 actorA 及其依赖项。但这很像 DI 世界中的“新对象”。为了测试,我最终会覆盖创建演员的地方。
Scalatra 文档建议在启动时创建我的演员,所以我觉得我在这里错过了一些东西。任何帮助表示赞赏。
干杯,克里斯。
编辑
我对@futurechimp 和@cmbaxter 都+1,因为它们看起来都有效但略有冲突。所以这是对你们俩的公开评论。
所以@cmbaxter 我认为你的建议是正确的,不要对路由的演员调用“停止”,而只是维护一个池供所有请求使用。还有@futurechimp,你建议让servlet根据请求实例化演员并在生命周期结束时杀死他们。正确的?
似乎每个请求都会产生更多的演员(但处置他们)。投票对于所有请求只有有限的集合,在这种情况下,这种方法是否存在潜在的瓶颈?
我想基本上,我在问我的假设是否正确,如果正确,这两种方法的优缺点是什么?