演员消息应该在哪里宣布?

时间:2015-01-04 15:22:47

标签: scala akka actor

我正在使用Akka开发一个应用程序,而且一直让我感到困惑的是Actor&#39}的消息声明。我应该在哪里声明消息?在接收器伴侣对象或发送者伴侣对象或第三位?

2 个答案:

答案 0 :(得分:9)

Akka团队建议在props方法应该在同一个地方定义Message:in the Receiver's Companion object因为Receiver实现了receive部分功能,需要知道所有消息它支持。此外,多个发件人可以发送一组邮件(由Receiver实现),因此您无法将其放在一个发件人中。

答案 1 :(得分:4)

如果the official Typesafe Activator template activator-akka-scala-seed对于Akka的良好实践至关重要,则消息应该是伴随对象的一部分,如下面的PingActor actor所示(直接从模板中复制):

package com.example

import akka.actor.{Actor, ActorLogging, Props}

class PingActor extends Actor with ActorLogging {
  import PingActor._

  var counter = 0
  val pongActor = context.actorOf(PongActor.props, "pongActor")

  def receive = {
    case Initialize => 
      log.info("In PingActor - starting ping-pong")
      pongActor ! PingMessage("ping")   
    case PongActor.PongMessage(text) =>
      log.info("In PingActor - received message: {}", text)
      counter += 1
      if (counter == 3) context.system.shutdown()
      else sender() ! PingMessage("ping")
  } 
}

object PingActor {
  val props = Props[PingActor]
  case object Initialize
  case class PingMessage(text: String)
}

注意PingActor,其中包含演员所接受的所有消息(因为您可能已经注意到它未被严格遵守,因为PongActor.PongMessage也被接受,但未在伴侣对象PingActor)。

从另一个问题How to restrict actor messages to specific types? Viktor said

  

通常的做法是声明Actor可以接收哪些消息   在Actor的伴侣对象中,这使得它变得非常容易   知道它能收到什么。