为什么 akka actor 使用 ActorRef 作为参数类型而不是类型本身?
Why akka actor use ActorRef as paramater's type rather then the type itselfs?
我已经阅读了很多演员定义的例子class来构建一个程序。我注意到他们都使用 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,它 return ActorRef.I 也混淆了为什么不 return actor 的真实类型?
对演员的一些评论:
- 我们可以通过调用 actorOf 或 actorFor
创建一个 Actor 的多个实例
- 我们为我们创建的任何 actor 实例分配不同的名称
- 调用 actorOf 将 return 一个指向该实例的 ActorRef
- 您只能通过 ActorRef 发送消息来与 Actor 实例通信,这样 actor 实例就被封装了,无法访问其内部状态
- 使用 ActorRef 可以与本地或远程 actors 通信
- 每个演员(child)有一个parent(另一个演员),parent是使用actorOf
创建演员的人
- parent决定其child人
的监管策略
- 通常,您创建一个 actor 的实例,并与希望与该 actor 通信的其他 actor 共享生成的 ActorRef
我已经阅读了很多演员定义的例子class来构建一个程序。我注意到他们都使用 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,它 return ActorRef.I 也混淆了为什么不 return actor 的真实类型?
对演员的一些评论:
- 我们可以通过调用 actorOf 或 actorFor 创建一个 Actor 的多个实例
- 我们为我们创建的任何 actor 实例分配不同的名称
- 调用 actorOf 将 return 一个指向该实例的 ActorRef
- 您只能通过 ActorRef 发送消息来与 Actor 实例通信,这样 actor 实例就被封装了,无法访问其内部状态
- 使用 ActorRef 可以与本地或远程 actors 通信
- 每个演员(child)有一个parent(另一个演员),parent是使用actorOf 创建演员的人
- parent决定其child人 的监管策略
- 通常,您创建一个 actor 的实例,并与希望与该 actor 通信的其他 actor 共享生成的 ActorRef