Просто сделайте список, который родительский субъект заполняет из базы данных неизменным. Затем родитель может поделиться этим списком с дочерними актерами, не заботясь о подводных камнях, которые сопровождают разделяемое изменяемое состояние . Дочерние субъекты могут запрашивать у родителя список, а родитель может отправлять список детям посредством передачи сообщений. Актеры могут выглядеть примерно так:
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, если вы предпочитаете. Также обратите внимание, что дочерние акторы принимают в качестве аргумента конструктора ссылку на родительский актер, но дочерний объект может также использовать context.parent
для получения ссылки на своего родителя.