我正在使用Akka处理申请。我有一个场景,参与者会从数组或列表中的数据库中获取某些值。子角色将引用此列表,但不允许他们对其进行修改或更新。
我有什么方法可以在演员之间共享数据?
答案 0 :(得分:1)
只需将父actor从数据库填充的列表设为不可变的。然后,家长可以与孩子演员共享此列表,而不必担心shared mutable state所带来的陷阱。子演员可以向父母要求列表,父母可以通过消息传递将列表发送给孩子。演员可能看起来像这样:
case object GetFromDb
case object GetList
case object ProcessList
class ParentActor extends Actor {
var fromDb: List[Something] = List()
def receive = {
case GetFromDb =>
// query the database and replace fromDb with a new list
fromDb = // ...
case GetList =>
sender() ! fromDb
}
}
class ChildActor(parent: ActorRef) extends Actor {
def receive = {
case ProcessList =>
// get the list from the parent
parent ! GetList
case fromDb: List[Something] =>
// do something with the list
}
}
在上面的示例中,参与者按原样传递了一个不可变的列表,但是如果愿意,可以轻松地将该列表放置在case类中。还要注意,子actor将对父actor的引用作为构造函数参数,但是子actor也可以使用context.parent
来获取对其父parent的引用。