我有一个ActorSystem,我创建了一个顶级演员,在这个顶级演员中,我创建了几个子actor。到目前为止还不错!
然后我做的是将这些子actor暴露给我的应用程序控制器(在Play应用程序中),这样我就可以直接从Play控制器管道用于相应子actor的消息。这是一个很好的做法还是应该总是通过主管将消息传递给儿童演员?在代码中,它看起来如下所示:
class Application extends Controller with MyActors {
def createUser = { request =>
val user: User = ... get the User from the request body
userActor ! user
}
}
这是我的Supervisor Actor的样子,它由Play应用程序生命周期插件控制:
class SupervisorActor extends Actor with ActorLogging {
val allActors = MyActors(context.system.settings.config, context)
context watch allActors.userActor
// TODO: what should we do in this SupervisorActor?
def receive = {
case Terminated(terminate) => context stop self
case _ =>
}
}
然后我将此MyActors注入Play应用程序控制器。所以我的问题是,这是一个好方法吗?儿童演员直接从外界接收消息,而消息不必通过主管演员。这是一个好方法。这种方法可以带来什么问题?
答案 0 :(得分:1)
你的方法本质上没有任何坏处或好处。有些问题需要与儿童演员直接沟通,有些人要求使用主管。
我想说,如果你需要某种类型的路由逻辑,例如联系主管是有益的。根据消息内容,1个消息被广播给所有子Actors或路由。
另一方面,如果主管有其他责任并且您想分配工作量,最好直接联系孩子。
我个人倾向于只与主管沟通,因为它允许“单门”方法。在代码的其他区域依赖注入主管通常也更容易,这样您就不必查看子ActorRef。