为什么akka actor使用ActorRef作为paramater的类型而不是类型本身?

时间:2017-01-09 14:42:42

标签: akka actor

我已经阅读了许多用于构建程序的actors类定义的示例。我注意到他们所有人都使用ActorRef作为参数类型。例如,

class LogProcessor(dbWriter: ActorRef)
    extends Actor with ActorLogging with LogParsing {

    import LogProcessor._

    def receive = {
      case LogFile(file) =>
        val lines: Vector[DbWriter.Line] = parse(file)
        lines.foreach(dbWriter ! _)
    }
}

dbWriter的实际类型DBWriter定义为:

class DbWriter(databaseUrl: String) extends Actor {
    val connection = new DbCon(databaseUrl)

    import DbWriter._
    def receive = {
      case Line(time, message, messageType) =>
        connection.write(Map('time -> time,
          'message -> message,
          'messageType -> messageType))
    }

    override def postStop(): Unit = {
      connection.close() 
    }
  }

在这个例子中,为什么不使用DbWriter作为dbWriter的类型?
如果我们在任何地方使用ActorRef,那么程序看起来就像一个弱类型系统 此外,Akka actor使用actorOf方法创建子actor并返回ActorRef.I也混淆了为什么不返回actor的真实类型?

1 个答案:

答案 0 :(得分:0)

关于演员的一些评论:

  • 我们可以通过调用actorOf或actorFor
  • 来创建Actor的许多实例
  • 我们为我们创建的任何演员实例指定一个不同的名称
  • 调用actorOf将返回指向该实例的ActorRef
  • 您只能通过其ActorRef发送消息与Actor的实例进行通信,这样就封装了actor实例并且无法访问其内部状态
  • 使用ActorRef可以与本地或远程演员进行通信
  • 每个演员(孩子)都有一个父母(另一个演员),父母是使用actorOf创建演员的人
  • 家长决定子女的监督策略
  • 通常,您创建一个actor实例并与希望与该actor通信的其他actor共享生成的ActorRef