Akka演员和消息处理

时间:2015-11-07 09:09:32

标签: java akka

我有一个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应用程序控制器。所以我的问题是,这是一个好方法吗?儿童演员直接从外界接收消息,而消息不必通过主管演员。这是一个好方法。这种方法可以带来什么问题?

1 个答案:

答案 0 :(得分:1)

你的方法本质上没有任何坏处或好处。有些问题需要与儿童演员直接沟通,有些人要求使用主管。

我想说,如果你需要某种类型的路由逻辑,例如联系主管是有益的。根据消息内容,1个消息被广播给所有子Actors或路由。

另一方面,如果主管有其他责任并且您想分配工作量,最好直接联系孩子。

我个人倾向于只与主管沟通,因为它允许“单门”方法。在代码的其他区域依赖注入主管通常也更容易,这样您就不必查看子ActorRef。