我正在使用Akka开发一个应用程序,而且一直让我感到困惑的是Actor
&#39}的消息声明。我应该在哪里声明消息?在接收器伴侣对象或发送者伴侣对象或第三位?
答案 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的伴侣对象中,这使得它变得非常容易 知道它能收到什么。